@skyux/phone-field 8.7.2 → 9.0.0-alpha.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/documentation.json +11 -11
- package/esm2022/lib/modules/phone-field/phone-field-adapter.service.mjs +63 -0
- package/esm2022/lib/modules/phone-field/phone-field-input.directive.mjs +307 -0
- package/esm2022/lib/modules/phone-field/phone-field.component.mjs +397 -0
- package/{esm2020 → esm2022}/lib/modules/phone-field/phone-field.module.mjs +19 -19
- package/esm2022/lib/modules/shared/sky-phone-field-resources.module.mjs +60 -0
- package/esm2022/testing/phonefield/phone-field-fixture.mjs +151 -0
- package/{esm2020 → esm2022}/testing/phonefield/phone-field-testing.module.mjs +11 -11
- package/fesm2022/skyux-phone-field-testing.mjs +188 -0
- package/{fesm2020 → fesm2022}/skyux-phone-field-testing.mjs.map +1 -1
- package/fesm2022/skyux-phone-field.mjs +859 -0
- package/{fesm2020 → fesm2022}/skyux-phone-field.mjs.map +1 -1
- package/lib/modules/phone-field/phone-field-input.directive.d.ts +1 -1
- package/lib/modules/phone-field/phone-field.component.d.ts +1 -1
- package/package.json +20 -28
- package/esm2020/lib/modules/phone-field/phone-field-adapter.service.mjs +0 -66
- package/esm2020/lib/modules/phone-field/phone-field-input.directive.mjs +0 -291
- package/esm2020/lib/modules/phone-field/phone-field.component.mjs +0 -394
- package/esm2020/lib/modules/shared/sky-phone-field-resources.module.mjs +0 -60
- package/esm2020/testing/phonefield/phone-field-fixture.mjs +0 -148
- package/fesm2015/skyux-phone-field-testing.mjs +0 -207
- package/fesm2015/skyux-phone-field-testing.mjs.map +0 -1
- package/fesm2015/skyux-phone-field.mjs +0 -854
- package/fesm2015/skyux-phone-field.mjs.map +0 -1
- package/fesm2020/skyux-phone-field-testing.mjs +0 -185
- package/fesm2020/skyux-phone-field.mjs +0 -841
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/phone-field/types/country.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/phone-field/types/number-return-format.mjs +0 -0
- /package/{esm2020 → esm2022}/skyux-phone-field.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/skyux-phone-field-testing.mjs +0 -0
package/documentation.json
CHANGED
|
@@ -2422,14 +2422,9 @@
|
|
|
2422
2422
|
},
|
|
2423
2423
|
"codeExamples": [
|
|
2424
2424
|
{
|
|
2425
|
-
"fileName": "phone-field-demo.
|
|
2426
|
-
"filePath": "/projects/phone-field/documentation/code-examples/phone-field/basic/phone-field-demo.
|
|
2427
|
-
"rawContents": "
|
|
2428
|
-
},
|
|
2429
|
-
{
|
|
2430
|
-
"fileName": "phone-field-demo.component.scss",
|
|
2431
|
-
"filePath": "/projects/phone-field/documentation/code-examples/phone-field/basic/phone-field-demo.component.scss",
|
|
2432
|
-
"rawContents": ".phone-field-demo {\n width: 50%;\n\n &.ng-valid ::ng-deep .sky-phone-field {\n margin-bottom: 0;\n }\n}\n"
|
|
2425
|
+
"fileName": "phone-field-demo.module.ts",
|
|
2426
|
+
"filePath": "/projects/phone-field/documentation/code-examples/phone-field/basic/phone-field-demo.module.ts",
|
|
2427
|
+
"rawContents": "import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { SkyInputBoxModule } from '@skyux/forms';\nimport { SkyStatusIndicatorModule } from '@skyux/indicators';\nimport { SkyPhoneFieldModule } from '@skyux/phone-field';\n\nimport { PhoneFieldDemoComponent } from './phone-field-demo.component';\n\n@NgModule({\n declarations: [PhoneFieldDemoComponent],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n SkyInputBoxModule,\n SkyPhoneFieldModule,\n SkyStatusIndicatorModule,\n ],\n exports: [PhoneFieldDemoComponent],\n})\nexport class PhoneFieldDemoModule {}\n"
|
|
2433
2428
|
},
|
|
2434
2429
|
{
|
|
2435
2430
|
"fileName": "phone-field-demo.component.ts",
|
|
@@ -2437,9 +2432,14 @@
|
|
|
2437
2432
|
"rawContents": "import { Component } from '@angular/core';\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\n\n@Component({\n selector: 'app-phone-field-demo',\n templateUrl: './phone-field-demo.component.html',\n styleUrls: ['./phone-field-demo.component.scss'],\n})\nexport class PhoneFieldDemoComponent {\n public phoneControl: UntypedFormControl;\n\n public phoneForm: UntypedFormGroup;\n\n constructor() {\n this.phoneControl = new UntypedFormControl();\n this.phoneForm = new UntypedFormGroup({\n phoneControl: this.phoneControl,\n });\n }\n}\n"
|
|
2438
2433
|
},
|
|
2439
2434
|
{
|
|
2440
|
-
"fileName": "phone-field-demo.
|
|
2441
|
-
"filePath": "/projects/phone-field/documentation/code-examples/phone-field/basic/phone-field-demo.
|
|
2442
|
-
"rawContents": "
|
|
2435
|
+
"fileName": "phone-field-demo.component.scss",
|
|
2436
|
+
"filePath": "/projects/phone-field/documentation/code-examples/phone-field/basic/phone-field-demo.component.scss",
|
|
2437
|
+
"rawContents": ".phone-field-demo {\n width: 50%;\n\n &.ng-valid ::ng-deep .sky-phone-field {\n margin-bottom: 0;\n }\n}\n"
|
|
2438
|
+
},
|
|
2439
|
+
{
|
|
2440
|
+
"fileName": "phone-field-demo.component.html",
|
|
2441
|
+
"filePath": "/projects/phone-field/documentation/code-examples/phone-field/basic/phone-field-demo.component.html",
|
|
2442
|
+
"rawContents": "<form class=\"phone-field-demo\" [formGroup]=\"phoneForm\">\n <sky-input-box labelText=\"Phone number\">\n <sky-phone-field [defaultCountry]=\"'us'\">\n <input formControlName=\"phoneControl\" skyPhoneFieldInput />\n </sky-phone-field>\n </sky-input-box>\n</form>\n"
|
|
2443
2443
|
}
|
|
2444
2444
|
]
|
|
2445
2445
|
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { takeUntil } from 'rxjs/operators';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@skyux/i18n";
|
|
6
|
+
/**
|
|
7
|
+
* Service for interacting with the DOM elements of the phone field.
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export class SkyPhoneFieldAdapterService {
|
|
11
|
+
#ngUnsubscribe = new Subject();
|
|
12
|
+
#renderer;
|
|
13
|
+
#resourcesService;
|
|
14
|
+
constructor(renderer, resourcesService) {
|
|
15
|
+
this.#renderer = renderer;
|
|
16
|
+
this.#resourcesService = resourcesService;
|
|
17
|
+
}
|
|
18
|
+
ngOnDestroy() {
|
|
19
|
+
this.#ngUnsubscribe.next();
|
|
20
|
+
this.#ngUnsubscribe.complete();
|
|
21
|
+
}
|
|
22
|
+
addElementClass(elementRef, className) {
|
|
23
|
+
this.#renderer.addClass(elementRef.nativeElement, className);
|
|
24
|
+
}
|
|
25
|
+
setElementDisabledState(elementRef, disabled) {
|
|
26
|
+
this.#renderer.setProperty(elementRef.nativeElement, 'disabled', disabled);
|
|
27
|
+
}
|
|
28
|
+
setElementPlaceholder(elementRef, placeholder) {
|
|
29
|
+
this.#renderer.setAttribute(elementRef.nativeElement, 'placeholder', placeholder);
|
|
30
|
+
}
|
|
31
|
+
setElementType(elementRef) {
|
|
32
|
+
this.#renderer.setAttribute(elementRef.nativeElement, 'type', 'tel');
|
|
33
|
+
}
|
|
34
|
+
setElementValue(elementRef, value) {
|
|
35
|
+
this.#renderer.setProperty(elementRef.nativeElement, 'value', value);
|
|
36
|
+
}
|
|
37
|
+
setAriaLabel(element) {
|
|
38
|
+
/* Sanity check */
|
|
39
|
+
/* istanbul ignore else */
|
|
40
|
+
if (!element.nativeElement.getAttribute('aria-label')) {
|
|
41
|
+
this.#resourcesService
|
|
42
|
+
.getString('skyux_phone_field_default_label')
|
|
43
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
44
|
+
.subscribe((value) => {
|
|
45
|
+
this.#renderer.setAttribute(element.nativeElement, 'aria-label', value);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
focusCountrySearchElement(el) {
|
|
50
|
+
const input = el.querySelector('textarea');
|
|
51
|
+
input?.focus();
|
|
52
|
+
}
|
|
53
|
+
focusPhoneInput(el) {
|
|
54
|
+
const input = el.querySelector('.sky-phone-field-container input');
|
|
55
|
+
input?.focus();
|
|
56
|
+
}
|
|
57
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPhoneFieldAdapterService, deps: [{ token: i0.Renderer2 }, { token: i1.SkyLibResourcesService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
58
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPhoneFieldAdapterService }); }
|
|
59
|
+
}
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPhoneFieldAdapterService, decorators: [{
|
|
61
|
+
type: Injectable
|
|
62
|
+
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.SkyLibResourcesService }]; } });
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtZmllbGQtYWRhcHRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3Bob25lLWZpZWxkL3NyYy9saWIvbW9kdWxlcy9waG9uZS1maWVsZC9waG9uZS1maWVsZC1hZGFwdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFHN0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUUzQzs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sMkJBQTJCO0lBQ3RDLGNBQWMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRXJDLFNBQVMsQ0FBWTtJQUNyQixpQkFBaUIsQ0FBeUI7SUFFMUMsWUFBWSxRQUFtQixFQUFFLGdCQUF3QztRQUN2RSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7SUFDNUMsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTSxlQUFlLENBQUMsVUFBc0IsRUFBRSxTQUFpQjtRQUM5RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFTSx1QkFBdUIsQ0FDNUIsVUFBc0IsRUFDdEIsUUFBaUI7UUFFakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVNLHFCQUFxQixDQUMxQixVQUFzQixFQUN0QixXQUFtQjtRQUVuQixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FDekIsVUFBVSxDQUFDLGFBQWEsRUFDeEIsYUFBYSxFQUNiLFdBQVcsQ0FDWixDQUFDO0lBQ0osQ0FBQztJQUVNLGNBQWMsQ0FBQyxVQUFzQjtRQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU0sZUFBZSxDQUFDLFVBQXNCLEVBQUUsS0FBYTtRQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU0sWUFBWSxDQUFDLE9BQW1CO1FBQ3JDLGtCQUFrQjtRQUNsQiwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3JELElBQUksQ0FBQyxpQkFBaUI7aUJBQ25CLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQztpQkFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ3BDLFNBQVMsQ0FBQyxDQUFDLEtBQWEsRUFBRSxFQUFFO2dCQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FDekIsT0FBTyxDQUFDLGFBQWEsRUFDckIsWUFBWSxFQUNaLEtBQUssQ0FDTixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNILENBQUM7SUFFTSx5QkFBeUIsQ0FBQyxFQUFXO1FBQzFDLE1BQU0sS0FBSyxHQUF1QixFQUFFLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU0sZUFBZSxDQUFDLEVBQVc7UUFDaEMsTUFBTSxLQUFLLEdBQXVCLEVBQUUsQ0FBQyxhQUFhLENBQ2hELGtDQUFrQyxDQUNuQyxDQUFDO1FBQ0YsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2pCLENBQUM7OEdBekVVLDJCQUEyQjtrSEFBM0IsMkJBQTJCOzsyRkFBM0IsMkJBQTJCO2tCQUR2QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNreUxpYlJlc291cmNlc1NlcnZpY2UgfSBmcm9tICdAc2t5dXgvaTE4bic7XG5cbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBTZXJ2aWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBET00gZWxlbWVudHMgb2YgdGhlIHBob25lIGZpZWxkLlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTa3lQaG9uZUZpZWxkQWRhcHRlclNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAjbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgI3JlbmRlcmVyOiBSZW5kZXJlcjI7XG4gICNyZXNvdXJjZXNTZXJ2aWNlOiBTa3lMaWJSZXNvdXJjZXNTZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKHJlbmRlcmVyOiBSZW5kZXJlcjIsIHJlc291cmNlc1NlcnZpY2U6IFNreUxpYlJlc291cmNlc1NlcnZpY2UpIHtcbiAgICB0aGlzLiNyZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgIHRoaXMuI3Jlc291cmNlc1NlcnZpY2UgPSByZXNvdXJjZXNTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFbGVtZW50Q2xhc3MoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiNyZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0RWxlbWVudERpc2FibGVkU3RhdGUoXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBkaXNhYmxlZDogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICB0aGlzLiNyZW5kZXJlci5zZXRQcm9wZXJ0eShlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGRpc2FibGVkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFbGVtZW50UGxhY2Vob2xkZXIoXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIHRoaXMuI3JlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgIGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICdwbGFjZWhvbGRlcicsXG4gICAgICBwbGFjZWhvbGRlclxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0RWxlbWVudFR5cGUoZWxlbWVudFJlZjogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIHRoaXMuI3JlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd0eXBlJywgJ3RlbCcpO1xuICB9XG5cbiAgcHVibGljIHNldEVsZW1lbnRWYWx1ZShlbGVtZW50UmVmOiBFbGVtZW50UmVmLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jcmVuZGVyZXIuc2V0UHJvcGVydHkoZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0QXJpYUxhYmVsKGVsZW1lbnQ6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICAvKiBTYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICghZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpKSB7XG4gICAgICB0aGlzLiNyZXNvdXJjZXNTZXJ2aWNlXG4gICAgICAgIC5nZXRTdHJpbmcoJ3NreXV4X3Bob25lX2ZpZWxkX2RlZmF1bHRfbGFiZWwnKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICB0aGlzLiNyZW5kZXJlci5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAnYXJpYS1sYWJlbCcsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmb2N1c0NvdW50cnlTZWFyY2hFbGVtZW50KGVsOiBFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgaW5wdXQ/LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNQaG9uZUlucHV0KGVsOiBFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLnNreS1waG9uZS1maWVsZC1jb250YWluZXIgaW5wdXQnXG4gICAgKTtcbiAgICBpbnB1dD8uZm9jdXMoKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
2
|
+
import { Directive, HostListener, Input, Optional, forwardRef, } from '@angular/core';
|
|
3
|
+
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
|
|
4
|
+
import { PhoneNumberFormat, PhoneNumberUtil } from 'google-libphonenumber';
|
|
5
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
|
6
|
+
import { debounceTime, takeUntil } from 'rxjs/operators';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "./phone-field-adapter.service";
|
|
9
|
+
import * as i2 from "./phone-field.component";
|
|
10
|
+
const SKY_PHONE_FIELD_VALUE_ACCESSOR = {
|
|
11
|
+
provide: NG_VALUE_ACCESSOR,
|
|
12
|
+
useExisting: forwardRef(() => SkyPhoneFieldInputDirective),
|
|
13
|
+
multi: true,
|
|
14
|
+
};
|
|
15
|
+
const SKY_PHONE_FIELD_VALIDATOR = {
|
|
16
|
+
provide: NG_VALIDATORS,
|
|
17
|
+
useExisting: forwardRef(() => SkyPhoneFieldInputDirective),
|
|
18
|
+
multi: true,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Creates a button, search input, and text input for entering and validating
|
|
22
|
+
* international phone numbers. Place this attribute on an `input` element, and wrap
|
|
23
|
+
* that element in a `sky-phone-field` component. By default, the country selector
|
|
24
|
+
* button displays a flag icon for the default country, and the phone number input
|
|
25
|
+
* displays a sample of the correct phone number format. When users select the country
|
|
26
|
+
* selector button, they expose the country search input, which is
|
|
27
|
+
* [an autocomplete input](https://developer.blackbaud.com/skyux/components/autocomplete)
|
|
28
|
+
* that allows them to select different countries. When users enter `+` followed by an
|
|
29
|
+
* international dial code in the phone number input, the country automatically switches
|
|
30
|
+
* to the country associated with the dial code.
|
|
31
|
+
* @required
|
|
32
|
+
*/
|
|
33
|
+
export class SkyPhoneFieldInputDirective {
|
|
34
|
+
/**
|
|
35
|
+
* Whether to disable the phone field on template-driven forms. Don't use this input on reactive forms because they may overwrite the input or leave the control out of sync.
|
|
36
|
+
* To set the disabled state on reactive forms, use the `FormControl` instead.
|
|
37
|
+
* @default false
|
|
38
|
+
*/
|
|
39
|
+
set disabled(value) {
|
|
40
|
+
const coercedValue = coerceBooleanProperty(value);
|
|
41
|
+
if (this.#phoneFieldComponent) {
|
|
42
|
+
this.#phoneFieldComponent.countrySelectDisabled = coercedValue;
|
|
43
|
+
this.#adapterService?.setElementDisabledState(this.#elRef, coercedValue);
|
|
44
|
+
}
|
|
45
|
+
this.#_disabled = coercedValue;
|
|
46
|
+
}
|
|
47
|
+
get disabled() {
|
|
48
|
+
return this.#_disabled;
|
|
49
|
+
}
|
|
50
|
+
set #modelValue(value) {
|
|
51
|
+
const valueOrDefault = value ?? '';
|
|
52
|
+
this.#_modelValue = valueOrDefault;
|
|
53
|
+
this.#adapterService?.setElementValue(this.#elRef, valueOrDefault);
|
|
54
|
+
if (valueOrDefault) {
|
|
55
|
+
const formattedValue = this.#formatNumber(valueOrDefault.toString());
|
|
56
|
+
this.#onChange(formattedValue);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
this.#onChange(valueOrDefault);
|
|
60
|
+
}
|
|
61
|
+
this.#validatorChange();
|
|
62
|
+
}
|
|
63
|
+
get #modelValue() {
|
|
64
|
+
return this.#_modelValue;
|
|
65
|
+
}
|
|
66
|
+
#control;
|
|
67
|
+
#textChanges;
|
|
68
|
+
#ngUnsubscribe;
|
|
69
|
+
#phoneUtils;
|
|
70
|
+
#_disabled;
|
|
71
|
+
#_modelValue;
|
|
72
|
+
#changeDetector;
|
|
73
|
+
#elRef;
|
|
74
|
+
#adapterService;
|
|
75
|
+
#phoneFieldComponent;
|
|
76
|
+
constructor(changeDetector, elRef, adapterService, phoneFieldComponent) {
|
|
77
|
+
/**
|
|
78
|
+
* Whether to prevent validation on the phone number input. For validation,
|
|
79
|
+
* phone numbers are driven through the `ngModel` attribute that you specify on an
|
|
80
|
+
* `input` element or on a `FormControl` in a reactive form. To prevent validation,
|
|
81
|
+
* set this property to `true`.
|
|
82
|
+
* @default false
|
|
83
|
+
*/
|
|
84
|
+
this.skyPhoneFieldNoValidate = false;
|
|
85
|
+
this.#ngUnsubscribe = new Subject();
|
|
86
|
+
this.#phoneUtils = PhoneNumberUtil.getInstance();
|
|
87
|
+
this.#_modelValue = '';
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function , @typescript-eslint/no-unused-vars
|
|
89
|
+
this.#onChange = (_) => { };
|
|
90
|
+
// istanbul ignore next
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
92
|
+
this.#onTouched = () => { };
|
|
93
|
+
// istanbul ignore next
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
95
|
+
this.#validatorChange = () => { };
|
|
96
|
+
this.#changeDetector = changeDetector;
|
|
97
|
+
this.#elRef = elRef;
|
|
98
|
+
this.#adapterService = adapterService;
|
|
99
|
+
this.#phoneFieldComponent = phoneFieldComponent;
|
|
100
|
+
}
|
|
101
|
+
ngOnInit() {
|
|
102
|
+
if (!this.#phoneFieldComponent) {
|
|
103
|
+
throw new Error('You must wrap the `skyPhoneFieldInput` directive within a ' +
|
|
104
|
+
'`<sky-phone-field>` component!');
|
|
105
|
+
}
|
|
106
|
+
this.#adapterService?.setElementType(this.#elRef);
|
|
107
|
+
this.#adapterService?.addElementClass(this.#elRef, 'sky-form-control');
|
|
108
|
+
if (this.#phoneFieldComponent?.selectedCountry?.exampleNumber) {
|
|
109
|
+
this.#adapterService?.setElementPlaceholder(this.#elRef, this.#phoneFieldComponent.selectedCountry.exampleNumber);
|
|
110
|
+
}
|
|
111
|
+
this.#adapterService?.setAriaLabel(this.#elRef);
|
|
112
|
+
}
|
|
113
|
+
ngAfterViewInit() {
|
|
114
|
+
this.#phoneFieldComponent?.selectedCountryChange
|
|
115
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
116
|
+
.subscribe((country) => {
|
|
117
|
+
this.#modelValue = this.#elRef.nativeElement.value;
|
|
118
|
+
if (country?.exampleNumber) {
|
|
119
|
+
this.#adapterService?.setElementPlaceholder(this.#elRef, country.exampleNumber);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
// This is needed to address a bug in Angular 4, where the value is not changed on the view.
|
|
123
|
+
// See: https://github.com/angular/angular/issues/13792
|
|
124
|
+
/* istanbul ignore else */
|
|
125
|
+
if (this.#control && this.#modelValue) {
|
|
126
|
+
this.#control.setValue(this.#modelValue, { emitEvent: false });
|
|
127
|
+
this.#changeDetector.detectChanges();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
ngOnDestroy() {
|
|
131
|
+
this.#ngUnsubscribe.next();
|
|
132
|
+
this.#ngUnsubscribe.complete();
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Writes the new value for reactive forms on change events on the input element
|
|
136
|
+
* @param event The change event that was received
|
|
137
|
+
*/
|
|
138
|
+
onInputChange(event) {
|
|
139
|
+
if (!this.#textChanges) {
|
|
140
|
+
this.#setupTextChangeSubscription(event.target.value);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
this.#textChanges.next(event.target.value);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Marks reactive form controls as touched on input blur events
|
|
148
|
+
*/
|
|
149
|
+
onInputBlur() {
|
|
150
|
+
this.#onTouched();
|
|
151
|
+
}
|
|
152
|
+
onInputTyping(event) {
|
|
153
|
+
if (!this.#textChanges) {
|
|
154
|
+
this.#setupTextChangeSubscription(event.target.value);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
this.#textChanges.next(event.target.value);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Writes the new value for reactive forms
|
|
162
|
+
* @param value The new value for the input
|
|
163
|
+
*/
|
|
164
|
+
writeValue(value) {
|
|
165
|
+
this.#phoneFieldComponent?.setCountryByDialCode(value);
|
|
166
|
+
this.#modelValue = value;
|
|
167
|
+
}
|
|
168
|
+
registerOnChange(fn) {
|
|
169
|
+
this.#onChange = fn;
|
|
170
|
+
}
|
|
171
|
+
registerOnTouched(fn) {
|
|
172
|
+
this.#onTouched = fn;
|
|
173
|
+
}
|
|
174
|
+
registerOnValidatorChange(fn) {
|
|
175
|
+
this.#validatorChange = fn;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Sets the disabled state on the input
|
|
179
|
+
* @param isDisabled the new value of the input's disabled state
|
|
180
|
+
*/
|
|
181
|
+
setDisabledState(isDisabled) {
|
|
182
|
+
this.disabled = isDisabled;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Validate's the form control's current value
|
|
186
|
+
* @param control the form control for the input
|
|
187
|
+
*/
|
|
188
|
+
validate(control) {
|
|
189
|
+
if (!this.#control) {
|
|
190
|
+
this.#control = control;
|
|
191
|
+
}
|
|
192
|
+
if (this.skyPhoneFieldNoValidate) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
const value = control.value;
|
|
196
|
+
if (!value) {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
if (this.#phoneFieldComponent?.selectedCountry &&
|
|
200
|
+
!this.#validateNumber(value)) {
|
|
201
|
+
if (!this.#textChanges) {
|
|
202
|
+
// Mark the invalid control as touched so that the input's invalid CSS styles appear.
|
|
203
|
+
// (This is only required when the invalid value is set by the FormControl constructor.)
|
|
204
|
+
// We don't do this if the input is the active element so that we don't show validation
|
|
205
|
+
// errors unless it is invalid on initialization or the input has been blurred.
|
|
206
|
+
control.markAsTouched();
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
skyPhoneField: {
|
|
210
|
+
invalid: value,
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
#setupTextChangeSubscription(text) {
|
|
217
|
+
this.#textChanges = new BehaviorSubject(text);
|
|
218
|
+
this.#textChanges
|
|
219
|
+
.pipe(debounceTime(500), takeUntil(this.#ngUnsubscribe))
|
|
220
|
+
.subscribe((newValue) => {
|
|
221
|
+
this.writeValue(newValue);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
#validateNumber(phoneNumber) {
|
|
225
|
+
try {
|
|
226
|
+
const numberObj = this.#phoneUtils.parseAndKeepRawInput(phoneNumber, this.#phoneFieldComponent?.selectedCountry?.iso2);
|
|
227
|
+
if (this.#phoneFieldComponent &&
|
|
228
|
+
!this.#phoneFieldComponent.allowExtensions &&
|
|
229
|
+
numberObj.getExtension()) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
return this.#phoneUtils.isValidNumber(numberObj);
|
|
233
|
+
}
|
|
234
|
+
catch (e) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Format's the given phone number based on the currently selected country.
|
|
240
|
+
* @param phoneNumber The number to format
|
|
241
|
+
*/
|
|
242
|
+
#formatNumber(phoneNumber) {
|
|
243
|
+
try {
|
|
244
|
+
const numberObj = this.#phoneUtils.parseAndKeepRawInput(phoneNumber, this.#phoneFieldComponent?.selectedCountry?.iso2);
|
|
245
|
+
if (this.#phoneUtils.isPossibleNumber(numberObj)) {
|
|
246
|
+
switch (this.#phoneFieldComponent?.returnFormat) {
|
|
247
|
+
case 'international':
|
|
248
|
+
return this.#phoneUtils.format(numberObj, PhoneNumberFormat.INTERNATIONAL);
|
|
249
|
+
case 'national':
|
|
250
|
+
return this.#phoneUtils.format(numberObj, PhoneNumberFormat.NATIONAL);
|
|
251
|
+
case 'default':
|
|
252
|
+
default:
|
|
253
|
+
if (this.#phoneFieldComponent?.selectedCountry?.iso2 !==
|
|
254
|
+
this.#phoneFieldComponent?.defaultCountry) {
|
|
255
|
+
return this.#phoneUtils.format(numberObj, PhoneNumberFormat.INTERNATIONAL);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
return this.#phoneUtils.format(numberObj, PhoneNumberFormat.NATIONAL);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
return phoneNumber;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
/* sanity check */
|
|
268
|
+
/* istanbul ignore next */
|
|
269
|
+
return phoneNumber;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function , @typescript-eslint/no-unused-vars
|
|
273
|
+
#onChange;
|
|
274
|
+
// istanbul ignore next
|
|
275
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
276
|
+
#onTouched;
|
|
277
|
+
// istanbul ignore next
|
|
278
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
279
|
+
#validatorChange;
|
|
280
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPhoneFieldInputDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyPhoneFieldAdapterService, optional: true }, { token: i2.SkyPhoneFieldComponent, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
281
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.7", type: SkyPhoneFieldInputDirective, selector: "[skyPhoneFieldInput]", inputs: { disabled: "disabled", skyPhoneFieldNoValidate: "skyPhoneFieldNoValidate" }, host: { listeners: { "change": "onInputChange($event)", "blur": "onInputBlur()", "input": "onInputTyping($event)" } }, providers: [SKY_PHONE_FIELD_VALUE_ACCESSOR, SKY_PHONE_FIELD_VALIDATOR], ngImport: i0 }); }
|
|
282
|
+
}
|
|
283
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPhoneFieldInputDirective, decorators: [{
|
|
284
|
+
type: Directive,
|
|
285
|
+
args: [{
|
|
286
|
+
selector: '[skyPhoneFieldInput]',
|
|
287
|
+
providers: [SKY_PHONE_FIELD_VALUE_ACCESSOR, SKY_PHONE_FIELD_VALIDATOR],
|
|
288
|
+
}]
|
|
289
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyPhoneFieldAdapterService, decorators: [{
|
|
290
|
+
type: Optional
|
|
291
|
+
}] }, { type: i2.SkyPhoneFieldComponent, decorators: [{
|
|
292
|
+
type: Optional
|
|
293
|
+
}] }]; }, propDecorators: { disabled: [{
|
|
294
|
+
type: Input
|
|
295
|
+
}], skyPhoneFieldNoValidate: [{
|
|
296
|
+
type: Input
|
|
297
|
+
}], onInputChange: [{
|
|
298
|
+
type: HostListener,
|
|
299
|
+
args: ['change', ['$event']]
|
|
300
|
+
}], onInputBlur: [{
|
|
301
|
+
type: HostListener,
|
|
302
|
+
args: ['blur']
|
|
303
|
+
}], onInputTyping: [{
|
|
304
|
+
type: HostListener,
|
|
305
|
+
args: ['input', ['$event']]
|
|
306
|
+
}] } });
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtZmllbGQtaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3Bob25lLWZpZWxkL3NyYy9saWIvbW9kdWxlcy9waG9uZS1maWVsZC9waG9uZS1maWVsZC1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUdMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLFFBQVEsRUFDUixVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGFBQWEsRUFDYixpQkFBaUIsR0FHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQU16RCxNQUFNLDhCQUE4QixHQUFHO0lBQ3JDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztJQUMxRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHO0lBQ2hDLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUM7SUFDMUQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBRUY7Ozs7Ozs7Ozs7OztHQVlHO0FBS0gsTUFBTSxPQUFPLDJCQUEyQjtJQUd0Qzs7OztPQUlHO0lBQ0gsSUFDVyxRQUFRLENBQUMsS0FBMEI7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RUFDekM7NEJBQ0EsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FDNUIsU0FBUyxFQUNULGlCQUFpQixDQUFDLGFBQWEsQ0FDaEMsQ0FBQzt5QkFDSDs2QkFBTTs0QkFDTCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUM1QixTQUFTLEVBQ1QsaUJBQWlCLENBQUMsUUFBUSxDQUMzQixDQUFDO3lCQUNIO2lCQUNKO2FBQ0Y7aUJBQU07Z0JBQ0wsT0FBTyxXQUFXLENBQUM7YUFDcEI7U0FDRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1Ysa0JBQWtCO1lBQ2xCLDBCQUEwQjtZQUMxQixPQUFPLFdBQVcsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRCxvR0FBb0c7SUFDcEcsU0FBUyxDQUFpQztJQUUxQyx1QkFBdUI7SUFDdkIsZ0VBQWdFO0lBQ2hFLFVBQVUsQ0FBWTtJQUV0Qix1QkFBdUI7SUFDdkIsZ0VBQWdFO0lBQ2hFLGdCQUFnQixDQUFZOzhHQTdUakIsMkJBQTJCO2tHQUEzQiwyQkFBMkIsNFBBRjNCLENBQUMsOEJBQThCLEVBQUUseUJBQXlCLENBQUM7OzJGQUUzRCwyQkFBMkI7a0JBSnZDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsU0FBUyxFQUFFLENBQUMsOEJBQThCLEVBQUUseUJBQXlCLENBQUM7aUJBQ3ZFOzswQkF5RUksUUFBUTs7MEJBQ1IsUUFBUTs0Q0FoRUEsUUFBUTtzQkFEbEIsS0FBSztnQkFzQkMsdUJBQXVCO3NCQUQ3QixLQUFLO2dCQXdHQyxhQUFhO3NCQURuQixZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFhM0IsV0FBVztzQkFEakIsWUFBWTt1QkFBQyxNQUFNO2dCQU1iLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFBob25lTnVtYmVyRm9ybWF0LCBQaG9uZU51bWJlclV0aWwgfSBmcm9tICdnb29nbGUtbGlicGhvbmVudW1iZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2t5UGhvbmVGaWVsZEFkYXB0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9waG9uZS1maWVsZC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5UGhvbmVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4vcGhvbmUtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IFNreVBob25lRmllbGRDb3VudHJ5IH0gZnJvbSAnLi90eXBlcy9jb3VudHJ5JztcblxuY29uc3QgU0tZX1BIT05FX0ZJRUxEX1ZBTFVFX0FDQ0VTU09SID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2t5UGhvbmVGaWVsZElucHV0RGlyZWN0aXZlKSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG5jb25zdCBTS1lfUEhPTkVfRklFTERfVkFMSURBVE9SID0ge1xuICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTa3lQaG9uZUZpZWxkSW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJ1dHRvbiwgc2VhcmNoIGlucHV0LCBhbmQgdGV4dCBpbnB1dCBmb3IgZW50ZXJpbmcgYW5kIHZhbGlkYXRpbmdcbiAqIGludGVybmF0aW9uYWwgcGhvbmUgbnVtYmVycy4gUGxhY2UgdGhpcyBhdHRyaWJ1dGUgb24gYW4gYGlucHV0YCBlbGVtZW50LCBhbmQgd3JhcFxuICogdGhhdCBlbGVtZW50IGluIGEgYHNreS1waG9uZS1maWVsZGAgY29tcG9uZW50LiBCeSBkZWZhdWx0LCB0aGUgY291bnRyeSBzZWxlY3RvclxuICogYnV0dG9uIGRpc3BsYXlzIGEgZmxhZyBpY29uIGZvciB0aGUgZGVmYXVsdCBjb3VudHJ5LCBhbmQgdGhlIHBob25lIG51bWJlciBpbnB1dFxuICogZGlzcGxheXMgYSBzYW1wbGUgb2YgdGhlIGNvcnJlY3QgcGhvbmUgbnVtYmVyIGZvcm1hdC4gV2hlbiB1c2VycyBzZWxlY3QgdGhlIGNvdW50cnlcbiAqIHNlbGVjdG9yIGJ1dHRvbiwgdGhleSBleHBvc2UgdGhlIGNvdW50cnkgc2VhcmNoIGlucHV0LCB3aGljaCBpc1xuICogW2FuIGF1dG9jb21wbGV0ZSBpbnB1dF0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2F1dG9jb21wbGV0ZSlcbiAqIHRoYXQgYWxsb3dzIHRoZW0gdG8gc2VsZWN0IGRpZmZlcmVudCBjb3VudHJpZXMuIFdoZW4gdXNlcnMgZW50ZXIgYCtgIGZvbGxvd2VkIGJ5IGFuXG4gKiBpbnRlcm5hdGlvbmFsIGRpYWwgY29kZSBpbiB0aGUgcGhvbmUgbnVtYmVyIGlucHV0LCB0aGUgY291bnRyeSBhdXRvbWF0aWNhbGx5IHN3aXRjaGVzXG4gKiB0byB0aGUgY291bnRyeSBhc3NvY2lhdGVkIHdpdGggdGhlIGRpYWwgY29kZS5cbiAqIEByZXF1aXJlZFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc2t5UGhvbmVGaWVsZElucHV0XScsXG4gIHByb3ZpZGVyczogW1NLWV9QSE9ORV9GSUVMRF9WQUxVRV9BQ0NFU1NPUiwgU0tZX1BIT05FX0ZJRUxEX1ZBTElEQVRPUl0sXG59KVxuZXhwb3J0IGNsYXNzIFNreVBob25lRmllbGRJbnB1dERpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yXG57XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgdGhlIHBob25lIGZpZWxkIG9uIHRlbXBsYXRlLWRyaXZlbiBmb3Jtcy4gRG9uJ3QgdXNlIHRoaXMgaW5wdXQgb24gcmVhY3RpdmUgZm9ybXMgYmVjYXVzZSB0aGV5IG1heSBvdmVyd3JpdGUgdGhlIGlucHV0IG9yIGxlYXZlIHRoZSBjb250cm9sIG91dCBvZiBzeW5jLlxuICAgKiBUbyBzZXQgdGhlIGRpc2FibGVkIHN0YXRlIG9uIHJlYWN0aXZlIGZvcm1zLCB1c2UgdGhlIGBGb3JtQ29udHJvbGAgaW5zdGVhZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBjb2VyY2VkVmFsdWUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGlmICh0aGlzLiNwaG9uZUZpZWxkQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLiNwaG9uZUZpZWxkQ29tcG9uZW50LmNvdW50cnlTZWxlY3REaXNhYmxlZCA9IGNvZXJjZWRWYWx1ZTtcbiAgICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlPy5zZXRFbGVtZW50RGlzYWJsZWRTdGF0ZSh0aGlzLiNlbFJlZiwgY29lcmNlZFZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy4jX2Rpc2FibGVkID0gY29lcmNlZFZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jX2Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJldmVudCB2YWxpZGF0aW9uIG9uIHRoZSBwaG9uZSBudW1iZXIgaW5wdXQuIEZvciB2YWxpZGF0aW9uLFxuICAgKiBwaG9uZSBudW1iZXJzIGFyZSBkcml2ZW4gdGhyb3VnaCB0aGUgYG5nTW9kZWxgIGF0dHJpYnV0ZSB0aGF0IHlvdSBzcGVjaWZ5IG9uIGFuXG4gICAqIGBpbnB1dGAgZWxlbWVudCBvciBvbiBhIGBGb3JtQ29udHJvbGAgaW4gYSByZWFjdGl2ZSBmb3JtLiBUbyBwcmV2ZW50IHZhbGlkYXRpb24sXG4gICAqIHNldCB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBza3lQaG9uZUZpZWxkTm9WYWxpZGF0ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuXG4gIHNldCAjbW9kZWxWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgdmFsdWVPckRlZmF1bHQgPSB2YWx1ZSA/PyAnJztcbiAgICB0aGlzLiNfbW9kZWxWYWx1ZSA9IHZhbHVlT3JEZWZhdWx0O1xuICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlPy5zZXRFbGVtZW50VmFsdWUodGhpcy4jZWxSZWYsIHZhbHVlT3JEZWZhdWx0KTtcblxuICAgIGlmICh2YWx1ZU9yRGVmYXVsdCkge1xuICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLiNmb3JtYXROdW1iZXIodmFsdWVPckRlZmF1bHQudG9TdHJpbmcoKSk7XG5cbiAgICAgIHRoaXMuI29uQ2hhbmdlKGZvcm1hdHRlZFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jb25DaGFuZ2UodmFsdWVPckRlZmF1bHQpO1xuICAgIH1cbiAgICB0aGlzLiN2YWxpZGF0b3JDaGFuZ2UoKTtcbiAgfVxuXG4gIGdldCAjbW9kZWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNfbW9kZWxWYWx1ZTtcbiAgfVxuXG4gICNjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cbiAgI3RleHRDaGFuZ2VzOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICAjbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgI3Bob25lVXRpbHMgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKTtcblxuICAjX2Rpc2FibGVkITogYm9vbGVhbjtcblxuICAjX21vZGVsVmFsdWUgPSAnJztcblxuICAjY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmO1xuICAjZWxSZWY6IEVsZW1lbnRSZWY7XG5cbiAgI2FkYXB0ZXJTZXJ2aWNlOiBTa3lQaG9uZUZpZWxkQWRhcHRlclNlcnZpY2UgfCB1bmRlZmluZWQ7XG4gICNwaG9uZUZpZWxkQ29tcG9uZW50OiBTa3lQaG9uZUZpZWxkQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBlbFJlZjogRWxlbWVudFJlZixcbiAgICBAT3B0aW9uYWwoKSBhZGFwdGVyU2VydmljZT86IFNreVBob25lRmllbGRBZGFwdGVyU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwaG9uZUZpZWxkQ29tcG9uZW50PzogU2t5UGhvbmVGaWVsZENvbXBvbmVudFxuICApIHtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3RvciA9IGNoYW5nZURldGVjdG9yO1xuICAgIHRoaXMuI2VsUmVmID0gZWxSZWY7XG4gICAgdGhpcy4jYWRhcHRlclNlcnZpY2UgPSBhZGFwdGVyU2VydmljZTtcbiAgICB0aGlzLiNwaG9uZUZpZWxkQ29tcG9uZW50ID0gcGhvbmVGaWVsZENvbXBvbmVudDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI3Bob25lRmllbGRDb21wb25lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1lvdSBtdXN0IHdyYXAgdGhlIGBza3lQaG9uZUZpZWxkSW5wdXRgIGRpcmVjdGl2ZSB3aXRoaW4gYSAnICtcbiAgICAgICAgICAnYDxza3ktcGhvbmUtZmllbGQ+YCBjb21wb25lbnQhJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLiNhZGFwdGVyU2VydmljZT8uc2V0RWxlbWVudFR5cGUodGhpcy4jZWxSZWYpO1xuICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlPy5hZGRFbGVtZW50Q2xhc3ModGhpcy4jZWxSZWYsICdza3ktZm9ybS1jb250cm9sJyk7XG4gICAgaWYgKHRoaXMuI3Bob25lRmllbGRDb21wb25lbnQ/LnNlbGVjdGVkQ291bnRyeT8uZXhhbXBsZU51bWJlcikge1xuICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2U/LnNldEVsZW1lbnRQbGFjZWhvbGRlcihcbiAgICAgICAgdGhpcy4jZWxSZWYsXG4gICAgICAgIHRoaXMuI3Bob25lRmllbGRDb21wb25lbnQuc2VsZWN0ZWRDb3VudHJ5LmV4YW1wbGVOdW1iZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy4jYWRhcHRlclNlcnZpY2U/LnNldEFyaWFMYWJlbCh0aGlzLiNlbFJlZik7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuI3Bob25lRmllbGRDb21wb25lbnQ/LnNlbGVjdGVkQ291bnRyeUNoYW5nZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoY291bnRyeTogU2t5UGhvbmVGaWVsZENvdW50cnkpID0+IHtcbiAgICAgICAgdGhpcy4jbW9kZWxWYWx1ZSA9IHRoaXMuI2VsUmVmLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgICAgIGlmIChjb3VudHJ5Py5leGFtcGxlTnVtYmVyKSB7XG4gICAgICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2U/LnNldEVsZW1lbnRQbGFjZWhvbGRlcihcbiAgICAgICAgICAgIHRoaXMuI2VsUmVmLFxuICAgICAgICAgICAgY291bnRyeS5leGFtcGxlTnVtYmVyXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhZGRyZXNzIGEgYnVnIGluIEFuZ3VsYXIgNCwgd2hlcmUgdGhlIHZhbHVlIGlzIG5vdCBjaGFuZ2VkIG9uIHRoZSB2aWV3LlxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM3OTJcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLiNjb250cm9sICYmIHRoaXMuI21vZGVsVmFsdWUpIHtcbiAgICAgIHRoaXMuI2NvbnRyb2wuc2V0VmFsdWUodGhpcy4jbW9kZWxWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBuZXcgdmFsdWUgZm9yIHJlYWN0aXZlIGZvcm1zIG9uIGNoYW5nZSBldmVudHMgb24gdGhlIGlucHV0IGVsZW1lbnRcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBjaGFuZ2UgZXZlbnQgdGhhdCB3YXMgcmVjZWl2ZWRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbklucHV0Q2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI3RleHRDaGFuZ2VzKSB7XG4gICAgICB0aGlzLiNzZXR1cFRleHRDaGFuZ2VTdWJzY3JpcHRpb24oZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jdGV4dENoYW5nZXMubmV4dChldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyByZWFjdGl2ZSBmb3JtIGNvbnRyb2xzIGFzIHRvdWNoZWQgb24gaW5wdXQgYmx1ciBldmVudHNcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBwdWJsaWMgb25JbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy4jb25Ub3VjaGVkKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbklucHV0VHlwaW5nKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI3RleHRDaGFuZ2VzKSB7XG4gICAgICB0aGlzLiNzZXR1cFRleHRDaGFuZ2VTdWJzY3JpcHRpb24oZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jdGV4dENoYW5nZXMubmV4dChldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIG5ldyB2YWx1ZSBmb3IgcmVhY3RpdmUgZm9ybXNcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBpbnB1dFxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuI3Bob25lRmllbGRDb21wb25lbnQ/LnNldENvdW50cnlCeURpYWxDb2RlKHZhbHVlKTtcblxuICAgIHRoaXMuI21vZGVsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuI29uQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLiNvblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgb24gdGhlIGlucHV0XG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGlucHV0J3MgZGlzYWJsZWQgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSdzIHRoZSBmb3JtIGNvbnRyb2wncyBjdXJyZW50IHZhbHVlXG4gICAqIEBwYXJhbSBjb250cm9sIHRoZSBmb3JtIGNvbnRyb2wgZm9yIHRoZSBpbnB1dFxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuI2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuI2NvbnRyb2wgPSBjb250cm9sO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNreVBob25lRmllbGROb1ZhbGlkYXRlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLiNwaG9uZUZpZWxkQ29tcG9uZW50Py5zZWxlY3RlZENvdW50cnkgJiZcbiAgICAgICF0aGlzLiN2YWxpZGF0ZU51bWJlcih2YWx1ZSlcbiAgICApIHtcbiAgICAgIGlmICghdGhpcy4jdGV4dENoYW5nZXMpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgaW52YWxpZCBjb250cm9sIGFzIHRvdWNoZWQgc28gdGhhdCB0aGUgaW5wdXQncyBpbnZhbGlkIENTUyBzdHlsZXMgYXBwZWFyLlxuICAgICAgICAvLyAoVGhpcyBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gdGhlIGludmFsaWQgdmFsdWUgaXMgc2V0IGJ5IHRoZSBGb3JtQ29udHJvbCBjb25zdHJ1Y3Rvci4pXG4gICAgICAgIC8vIFdlIGRvbid0IGRvIHRoaXMgaWYgdGhlIGlucHV0IGlzIHRoZSBhY3RpdmUgZWxlbWVudCBzbyB0aGF0IHdlIGRvbid0IHNob3cgdmFsaWRhdGlvblxuICAgICAgICAvLyBlcnJvcnMgdW5sZXNzIGl0IGlzIGludmFsaWQgb24gaW5pdGlhbGl6YXRpb24gb3IgdGhlIGlucHV0IGhhcyBiZWVuIGJsdXJyZWQuXG4gICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBza3lQaG9uZUZpZWxkOiB7XG4gICAgICAgICAgaW52YWxpZDogdmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gICNzZXR1cFRleHRDaGFuZ2VTdWJzY3JpcHRpb24odGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jdGV4dENoYW5nZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRleHQpO1xuXG4gICAgdGhpcy4jdGV4dENoYW5nZXNcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApLCB0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUobmV3VmFsdWUpO1xuICAgICAgfSk7XG4gIH1cblxuICAjdmFsaWRhdGVOdW1iZXIocGhvbmVOdW1iZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBudW1iZXJPYmogPSB0aGlzLiNwaG9uZVV0aWxzLnBhcnNlQW5kS2VlcFJhd0lucHV0KFxuICAgICAgICBwaG9uZU51bWJlcixcbiAgICAgICAgdGhpcy4jcGhvbmVGaWVsZENvbXBvbmVudD8uc2VsZWN0ZWRDb3VudHJ5Py5pc28yXG4gICAgICApO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuI3Bob25lRmllbGRDb21wb25lbnQgJiZcbiAgICAgICAgIXRoaXMuI3Bob25lRmllbGRDb21wb25lbnQuYWxsb3dFeHRlbnNpb25zICYmXG4gICAgICAgIG51bWJlck9iai5nZXRFeHRlbnNpb24oKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuI3Bob25lVXRpbHMuaXNWYWxpZE51bWJlcihudW1iZXJPYmopO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0J3MgdGhlIGdpdmVuIHBob25lIG51bWJlciBiYXNlZCBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNvdW50cnkuXG4gICAqIEBwYXJhbSBwaG9uZU51bWJlciBUaGUgbnVtYmVyIHRvIGZvcm1hdFxuICAgKi9cbiAgI2Zvcm1hdE51bWJlcihwaG9uZU51bWJlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbnVtYmVyT2JqID0gdGhpcy4jcGhvbmVVdGlscy5wYXJzZUFuZEtlZXBSYXdJbnB1dChcbiAgICAgICAgcGhvbmVOdW1iZXIsXG4gICAgICAgIHRoaXMuI3Bob25lRmllbGRDb21wb25lbnQ/LnNlbGVjdGVkQ291bnRyeT8uaXNvMlxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLiNwaG9uZVV0aWxzLmlzUG9zc2libGVOdW1iZXIobnVtYmVyT2JqKSkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuI3Bob25lRmllbGRDb21wb25lbnQ/LnJldHVybkZvcm1hdCkge1xuICAgICAgICAgIGNhc2UgJ2ludGVybmF0aW9uYWwnOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3Bob25lVXRpbHMuZm9ybWF0KFxuICAgICAgICAgICAgICBudW1iZXJPYmosXG4gICAgICAgICAgICAgIFBob25lTnVtYmVyRm9ybWF0LklOVEVSTkFUSU9OQUxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSAnbmF0aW9uYWwnOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3Bob25lVXRpbHMuZm9ybWF0KFxuICAgICAgICAgICAgICBudW1iZXJPYmosXG4gICAgICAgICAgICAgIFBob25lTnVtYmVyRm9ybWF0Lk5BVElPTkFMXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgJ2RlZmF1bHQnOlxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMuI3Bob25lRmllbGRDb21wb25lbnQ/LnNlbGVjdGVkQ291bnRyeT8uaXNvMiAhPT1cbiAgICAgICAgICAgICAgdGhpcy4jcGhvbmVGaWVsZENvbXBvbmVudD8uZGVmYXVsdENvdW50cnlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jcGhvbmVVdGlscy5mb3JtYXQoXG4gICAgICAgICAgICAgICAgbnVtYmVyT2JqLFxuICAgICAgICAgICAgICAgIFBob25lTnVtYmVyRm9ybWF0LklOVEVSTkFUSU9OQUxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLiNwaG9uZVV0aWxzLmZvcm1hdChcbiAgICAgICAgICAgICAgICBudW1iZXJPYmosXG4gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJGb3JtYXQuTkFUSU9OQUxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBob25lTnVtYmVyO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBwaG9uZU51bWJlcjtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uICwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICNvbkNoYW5nZSA9IChfOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHt9O1xuXG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgI29uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgI3ZhbGlkYXRvckNoYW5nZSA9ICgpID0+IHt9O1xufVxuIl19
|