UNPKG

moh-common-lib

Version:

A library of Angular components, services, and styles for B.C. Government Ministry of Health (MoH).

343 lines 25.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, ChangeDetectorRef, Output, EventEmitter, Optional, Self } from '@angular/core'; import { Subject, of } from 'rxjs'; import { debounceTime, distinctUntilChanged, switchMap, catchError } from 'rxjs/operators'; import { Base } from '../../models/base'; import { GeocoderService } from '../../services/geocoder.service'; import { CANADA } from '../country/country.component'; import { BRITISH_COLUMBIA } from '../province/province.component'; import { Address } from '../../models/address.model'; import { NgControl } from '@angular/forms'; /** * @deprecated Please use `address-validator` component instead. * * For TemplateForms, pass in an Address and recieve an Address * \@example * <common-geocoder-input * label='Physical Address' * [(ngModel)]="myAddress"> * </common-geocoder-input> * * \@note * For ReactiveForms, pass in a string and recieve a string. If you need the * Address object you can use (select) in addition. * * \@example * <common-geocoder-input * label='Physical Address' * formControlName="address" * (select)="getAddressObject($event)"> * </common-geocoder-input> */ var GeocoderInputComponent = /** @class */ (function (_super) { tslib_1.__extends(GeocoderInputComponent, _super); function GeocoderInputComponent(controlDir, geocoderService, cd) { var _this = _super.call(this) || this; _this.controlDir = controlDir; _this.geocoderService = geocoderService; _this.cd = cd; _this.label = 'Address Lookup'; _this.addressChange = new EventEmitter(); _this.select = new EventEmitter(); _this.maxlength = '255'; /** * Is the Geocoder API request still in progress? */ _this.isTypeaheadLoading = false; /** * Geocoder API has returned and has no results, an empty array. */ _this.hasNoResults = false; _this.hasError = false; /** * Similar to this.address, but we can null it when user is searching for new addresses */ _this.selectedAddress = false; // Result from GeoCoderService address lookup /** * The subject that triggers on user text input and gets typeaheadList$ to update. */ _this.searchText$ = new Subject(); _this._onChange = (/** * @param {?} _ * @return {?} */ function (_) { }); _this._onTouched = (/** * @param {?=} _ * @return {?} */ function (_) { }); if (controlDir) { controlDir.valueAccessor = _this; } return _this; } /** * @return {?} */ GeocoderInputComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.typeaheadList$ = this.searchText$.pipe(debounceTime(500), distinctUntilChanged(), // Trigger the network request, get results switchMap((/** * @param {?} searchPhrase * @return {?} */ function (searchPhrase) { return _this.geocoderService.lookup(searchPhrase); })), catchError((/** * @param {?} err * @return {?} */ function (err) { return _this.onError(err); }))); }; /** * @param {?} err * @return {?} */ GeocoderInputComponent.prototype.onError = /** * @param {?} err * @return {?} */ function (err) { this.hasError = true; // Empty array simulates no result response, nothing for typeahead to iterate over return of([]); }; /** * @param {?} val * @return {?} */ GeocoderInputComponent.prototype.onLoading = /** * @param {?} val * @return {?} */ function (val) { this.isTypeaheadLoading = val; }; // Note - this will fire after an onError as well // Note - this will fire after an onError as well /** * @param {?} val * @return {?} */ GeocoderInputComponent.prototype.onNoResults = // Note - this will fire after an onError as well /** * @param {?} val * @return {?} */ function (val) { // If we have results, the error has resolved (e.g. network has re-connected) if (val === false) { this.hasError = false; } this.hasNoResults = val; }; /** * @param {?} event * @return {?} */ GeocoderInputComponent.prototype.onSelect = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var data = event.item; // Output string to FormControl. If street is more than the max length shorten /** @type {?} */ var stripped = this.stripStringToMaxLength(data.street); /** @type {?} */ var addr = new Address(); addr.city = data.city; // GeoCoder is only for BC, Canada, values can be set. addr.country = CANADA; // Default country is Canda addr.province = BRITISH_COLUMBIA; // Default province is BC addr.street = stripped; // Save and emit Address for (select) this.selectedAddress = true; this.select.emit(addr); this._onChange(stripped); }; /** * @param {?} event * @return {?} */ GeocoderInputComponent.prototype.onKeyUp = /** * @param {?} event * @return {?} */ function (event) { // Filter out 'enter' and other similar keyboard events that can trigger // when user is selecting a typeahead option instead of entering new text. // Without this filter, we do another HTTP request + force disiplay the UI // for now reason if (event.keyCode === 13 || event.keyCode === 9) { // enter & tab return; } // Clear out selection this.selectedAddress = false; this.searchText$.next(this.search); }; /** * @param {?} event * @return {?} */ GeocoderInputComponent.prototype.onBlur = /** * @param {?} event * @return {?} */ function (event) { this._onTouched(); this._onChange(this.search); }; /** * @param {?} value * @return {?} */ GeocoderInputComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { if (value !== undefined) { this.search = value; } }; // Register change function // Register change function /** * @param {?} fn * @return {?} */ GeocoderInputComponent.prototype.registerOnChange = // Register change function /** * @param {?} fn * @return {?} */ function (fn) { this._onChange = fn; }; // Register touched function // Register touched function /** * @param {?} fn * @return {?} */ GeocoderInputComponent.prototype.registerOnTouched = // Register touched function /** * @param {?} fn * @return {?} */ function (fn) { this._onTouched = fn; }; /** * @private * @param {?} str * @return {?} */ GeocoderInputComponent.prototype.stripStringToMaxLength = /** * @private * @param {?} str * @return {?} */ function (str) { /** @type {?} */ var maxlength = parseInt(this.maxlength, 10); return str.slice(0, maxlength); }; GeocoderInputComponent.decorators = [ { type: Component, args: [{ selector: 'common-geocoder-input', template: "\r\n<label for=\"geocoder_{{label}}\" class='text-nowrap'>{{label}}\r\n <span class=\"geocoder-status\">\r\n <ng-container *ngIf=\"isTypeaheadLoading; else statusContainer\"> &mdash; Loading\r\n <i class=\"fa fa-spinner fa-pulse fa-fw\"></i>\r\n </ng-container>\r\n </span>\r\n\r\n <ng-template #statusContainer>\r\n <ng-template *ngIf=\"selectedAddress; then addressSelected; else error;\"></ng-template>\r\n </ng-template>\r\n</label>\r\n<input class=\"form-control\"\r\n type=\"text\"\r\n id=\"geocoder_{{label}}\"\r\n name=\"geocoder_{{label}}\"\r\n [(ngModel)]='search'\r\n (keyup)='onKeyUp($event)'\r\n [typeahead]='typeaheadList$'\r\n [typeaheadIsFirstItemActive]=\"false\"\r\n [typeaheadSelectFirstItem]=\"false\"\r\n (typeaheadLoading)=\"onLoading($event)\"\r\n (typeaheadOnSelect)=\"onSelect($event)\"\r\n (typeaheadNoResults)=\"onNoResults($event)\"\r\n (blur)=\"onBlur($event)\"\r\n [attr.maxlength]='maxlength'\r\n typeaheadOptionField='fullAddress'\r\n typeaheadMinLength='3'\r\n autocomplete=\"off\"\r\n spellcheck=\"false\"\r\n />\r\n <!-- Intentionally using 'nope' for autocomplete as it is invalid and forces false - https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion -->\r\n\r\n\r\n<ng-template #addressSelected>\r\n <span> &mdash; Selected\r\n <i class=\"fa fa-check fa-fw text-success\"></i>\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #noResults>\r\n <span *ngIf=\"hasNoResults\"> &mdash; No Results\r\n <i class=\"fa fa-times fa-fw text-warning\"></i>\r\n </span>\r\n</ng-template>\r\n\r\n\r\n<ng-template #error>\r\n <span *ngIf='hasError; else noResults'> &mdash; Error\r\n <i class=\"fa fa-exclamation-triangle fa-fw text-danger\"></i>\r\n </span>\r\n</ng-template>\r\n", styles: [""] }] } ]; /** @nocollapse */ GeocoderInputComponent.ctorParameters = function () { return [ { type: NgControl, decorators: [{ type: Optional }, { type: Self }] }, { type: GeocoderService }, { type: ChangeDetectorRef } ]; }; GeocoderInputComponent.propDecorators = { label: [{ type: Input }], address: [{ type: Input }], addressChange: [{ type: Output }], select: [{ type: Output }], maxlength: [{ type: Input }] }; return GeocoderInputComponent; }(Base)); export { GeocoderInputComponent }; if (false) { /** @type {?} */ GeocoderInputComponent.prototype.label; /** @type {?} */ GeocoderInputComponent.prototype.address; /** @type {?} */ GeocoderInputComponent.prototype.addressChange; /** @type {?} */ GeocoderInputComponent.prototype.select; /** @type {?} */ GeocoderInputComponent.prototype.maxlength; /** * The string in the box the user has typed * @type {?} */ GeocoderInputComponent.prototype.search; /** * Is the Geocoder API request still in progress? * @type {?} */ GeocoderInputComponent.prototype.isTypeaheadLoading; /** * Geocoder API has returned and has no results, an empty array. * @type {?} */ GeocoderInputComponent.prototype.hasNoResults; /** @type {?} */ GeocoderInputComponent.prototype.hasError; /** * Similar to this.address, but we can null it when user is searching for new addresses * @type {?} */ GeocoderInputComponent.prototype.selectedAddress; /** * The list of results, from API, that is passed to the typeahead list * @type {?} */ GeocoderInputComponent.prototype.typeaheadList$; /** * The subject that triggers on user text input and gets typeaheadList$ to update. * @type {?} * @private */ GeocoderInputComponent.prototype.searchText$; /** @type {?} */ GeocoderInputComponent.prototype._onChange; /** @type {?} */ GeocoderInputComponent.prototype._onTouched; /** @type {?} */ GeocoderInputComponent.prototype.controlDir; /** * @type {?} * @private */ GeocoderInputComponent.prototype.geocoderService; /** * @type {?} * @private */ GeocoderInputComponent.prototype.cd; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvY29kZXItaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbW9oLWNvbW1vbi1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9nZW9jb2Rlci1pbnB1dC9nZW9jb2Rlci1pbnB1dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEgsT0FBTyxFQUFFLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0YsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQW9CLE1BQU0saUNBQWlDLENBQUM7QUFDcEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUF3QixNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JqRTtJQUs0QyxrREFBSTtJQTJCOUMsZ0NBQXVDLFVBQXFCLEVBQVUsZUFBZ0MsRUFBVSxFQUFxQjtRQUFySSxZQUNFLGlCQUFPLFNBSVI7UUFMc0MsZ0JBQVUsR0FBVixVQUFVLENBQVc7UUFBVSxxQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFBVSxRQUFFLEdBQUYsRUFBRSxDQUFtQjtRQXpCNUgsV0FBSyxHQUFXLGdCQUFnQixDQUFDO1FBRWhDLG1CQUFh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S0FBSztnQ0FDTCxNQUFNO3lCQUNOLE1BQU07NEJBRU4sS0FBSzs7SUF3SFIsNkJBQUM7Q0FBQSxBQXBJRCxDQUs0QyxJQUFJLEdBK0gvQztTQS9IWSxzQkFBc0I7OztJQUVqQyx1Q0FBMEM7O0lBQzFDLHlDQUF5Qjs7SUFDekIsK0NBQTJFOztJQUMzRSx3Q0FBc0U7O0lBRXRFLDJDQUFtQzs7Ozs7SUFHbkMsd0NBQXNCOzs7OztJQUV0QixvREFBMkM7Ozs7O0lBRTNDLDhDQUFxQzs7SUFDckMsMENBQWlDOzs7OztJQUdqQyxpREFBd0M7Ozs7O0lBRXhDLGdEQUFzRDs7Ozs7O0lBRXRELDZDQUE0Qzs7SUFFNUMsMkNBQTJCOztJQUMzQiw0Q0FBNkI7O0lBRWpCLDRDQUFnRDs7Ozs7SUFBRSxpREFBd0M7Ozs7O0lBQUUsb0NBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBDaGFuZ2VEZXRlY3RvclJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9wdGlvbmFsLCBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN3aXRjaE1hcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVHlwZWFoZWFkTWF0Y2ggfSBmcm9tICduZ3gtYm9vdHN0cmFwL3R5cGVhaGVhZCc7XHJcbmltcG9ydCB7IEJhc2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvYmFzZSc7XHJcbmltcG9ydCB7IEdlb2NvZGVyU2VydmljZSwgR2VvQWRkcmVzc1Jlc3VsdCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dlb2NvZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDQU5BREEgfSBmcm9tICcuLi9jb3VudHJ5L2NvdW50cnkuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQlJJVElTSF9DT0xVTUJJQSB9IGZyb20gJy4uL3Byb3ZpbmNlL3Byb3ZpbmNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFkZHJlc3MgfSBmcm9tICcuLi8uLi9tb2RlbHMvYWRkcmVzcy5tb2RlbCc7XHJcbmltcG9ydCB7IE5nQ29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5cclxuLyoqXHJcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgYGFkZHJlc3MtdmFsaWRhdG9yYCBjb21wb25lbnQgaW5zdGVhZC5cclxuICpcclxuICogRm9yIFRlbXBsYXRlRm9ybXMsIHBhc3MgaW4gYW4gQWRkcmVzcyBhbmQgcmVjaWV2ZSBhbiBBZGRyZXNzXHJcbiAqIEBleGFtcGxlXHJcbiAqICAgICAgICAgICA8Y29tbW9uLWdlb2NvZGVyLWlucHV0XHJcbiAqICAgICAgICAgICAgICAgbGFiZWw9J1BoeXNpY2FsIEFkZHJlc3MnXHJcbiAqICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJteUFkZHJlc3NcIj5cclxuICogICAgICAgICAgIDwvY29tbW9uLWdlb2NvZGVyLWlucHV0PlxyXG4gKlxyXG4gKiBAbm90ZVxyXG4gKiBGb3IgUmVhY3RpdmVGb3JtcywgcGFzcyBpbiBhIHN0cmluZyBhbmQgcmVjaWV2ZSBhIHN0cmluZy4gIElmIHlvdSBuZWVkIHRoZVxyXG4gKiBBZGRyZXNzIG9iamVjdCB5b3UgY2FuIHVzZSAoc2VsZWN0KSBpbiBhZGRpdGlvbi5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogICAgICAgICAgIDxjb21tb24tZ2VvY29kZXItaW5wdXRcclxuICogICAgICAgICAgICAgIGxhYmVsPSdQaHlzaWNhbCBBZGRyZXNzJ1xyXG4gKiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc1wiXHJcbiAqICAgICAgICAgICAgICAoc2VsZWN0KT1cImdldEFkZHJlc3NPYmplY3QoJGV2ZW50KVwiPlxyXG4gKiAgICAgICAgICA8L2NvbW1vbi1nZW9jb2Rlci1pbnB1dD5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY29tbW9uLWdlb2NvZGVyLWlucHV0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ2VvY29kZXItaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dlb2NvZGVyLWlucHV0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEdlb2NvZGVySW5wdXRDb21wb25lbnQgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnQWRkcmVzcyBMb29rdXAnO1xyXG4gIEBJbnB1dCgpIGFkZHJlc3M6IHN0cmluZztcclxuICBAT3V0cHV0KCkgYWRkcmVzc0NoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgc2VsZWN0OiBFdmVudEVtaXR0ZXI8QWRkcmVzcz4gPSBuZXcgRXZlbnRFbWl0dGVyPEFkZHJlc3M+KCk7XHJcblxyXG4gIEBJbnB1dCgpIG1heGxlbmd0aDogc3RyaW5nID0gJzI1NSc7XHJcblxyXG4gIC8qKiBUaGUgc3RyaW5nIGluIHRoZSBib3ggdGhlIHVzZXIgaGFzIHR5cGVkICovXHJcbiAgcHVibGljIHNlYXJjaDogc3RyaW5nO1xyXG4gIC8qKiBJcyB0aGUgR2VvY29kZXIgQVBJIHJlcXVlc3Qgc3RpbGwgaW4gcHJvZ3Jlc3M/ICovXHJcbiAgcHVibGljIGlzVHlwZWFoZWFkTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBHZW9jb2RlciBBUEkgaGFzIHJldHVybmVkIGFuZCBoYXMgbm8gcmVzdWx0cywgYW4gZW1wdHkgYXJyYXkuICovXHJcbiAgcHVibGljIGhhc05vUmVzdWx0czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBoYXNFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogU2ltaWxhciB0byB0aGlzLmFkZHJlc3MsIGJ1dCB3ZSBjYW4gbnVsbCBpdCB3aGVuIHVzZXIgaXMgc2VhcmNoaW5nIGZvciBuZXcgYWRkcmVzc2VzICovXHJcbiAgcHVibGljIHNlbGVjdGVkQWRkcmVzczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBUaGUgbGlzdCBvZiByZXN1bHRzLCBmcm9tIEFQSSwgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHR5cGVhaGVhZCBsaXN0ICovXHJcbiAgcHVibGljIHR5cGVhaGVhZExpc3QkOiBPYnNlcnZhYmxlPEdlb0FkZHJlc3NSZXN1bHRbXT47IC8vIFJlc3VsdCBmcm9tIEdlb0NvZGVyU2VydmljZSBhZGRyZXNzIGxvb2t1cFxyXG4gIC8qKiBUaGUgc3ViamVjdCB0aGF0IHRyaWdnZXJzIG9uIHVzZXIgdGV4dCBpbnB1dCBhbmQgZ2V0cyB0eXBlYWhlYWRMaXN0JCB0byB1cGRhdGUuICAqL1xyXG4gIHByaXZhdGUgc2VhcmNoVGV4dCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcblxyXG4gIF9vbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xyXG4gIF9vblRvdWNoZWQgPSAoXz86IGFueSkgPT4ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIGNvbnRyb2xEaXI6IE5nQ29udHJvbCwgcHJpdmF0ZSBnZW9jb2RlclNlcnZpY2U6IEdlb2NvZGVyU2VydmljZSwgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAoIGNvbnRyb2xEaXIgKSB7XHJcbiAgICAgIGNvbnRyb2xEaXIudmFsdWVBY2Nlc3NvciA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMudHlwZWFoZWFkTGlzdCQgPSB0aGlzLnNlYXJjaFRleHQkLnBpcGUoXHJcbiAgICAgIGRlYm91bmNlVGltZSg1MDApLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAvLyBUcmlnZ2VyIHRoZSBuZXR3b3JrIHJlcXVlc3QsIGdldCByZXN1bHRzXHJcbiAgICAgIHN3aXRjaE1hcChzZWFyY2hQaHJhc2UgPT4gdGhpcy5nZW9jb2RlclNlcnZpY2UubG9va3VwKHNlYXJjaFBocmFzZSkpLFxyXG4gICAgICBjYXRjaEVycm9yKGVyciA9PiB0aGlzLm9uRXJyb3IoZXJyKSlcclxuICAgICk7XHJcblxyXG4gIH1cclxuXHJcbiAgb25FcnJvcihlcnIpOiBPYnNlcnZhYmxlPEdlb0FkZHJlc3NSZXN1bHRbXT4ge1xyXG5cclxuICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgLy8gRW1wdHkgYXJyYXkgc2ltdWxhdGVzIG5vIHJlc3VsdCByZXNwb25zZSwgbm90aGluZyBmb3IgdHlwZWFoZWFkIHRvIGl0ZXJhdGUgb3ZlclxyXG4gICAgcmV0dXJuIG9mKFtdKTtcclxuICB9XHJcblxyXG4gIG9uTG9hZGluZyh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNUeXBlYWhlYWRMb2FkaW5nID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLy8gTm90ZSAtIHRoaXMgd2lsbCBmaXJlIGFmdGVyIGFuIG9uRXJyb3IgYXMgd2VsbFxyXG4gIG9uTm9SZXN1bHRzKHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG5cclxuICAgIC8vIElmIHdlIGhhdmUgcmVzdWx0cywgdGhlIGVycm9yIGhhcyByZXNvbHZlZCAoZS5nLiBuZXR3b3JrIGhhcyByZS1jb25uZWN0ZWQpXHJcbiAgICBpZiAodmFsID09PSBmYWxzZSkge1xyXG4gICAgICB0aGlzLmhhc0Vycm9yID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oYXNOb1Jlc3VsdHMgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdChldmVudDogVHlwZWFoZWFkTWF0Y2gpOiB2b2lkIHtcclxuXHJcbiAgICBjb25zdCBkYXRhOiBHZW9BZGRyZXNzUmVzdWx0ID0gZXZlbnQuaXRlbTtcclxuXHJcbiAgICAvLyBPdXRwdXQgc3RyaW5nIHRvIEZvcm1Db250cm9sLiBJZiBzdHJlZXQgaXMgbW9yZSB0aGFuIHRoZSBtYXggbGVuZ3RoIHNob3J0ZW5cclxuICAgIGNvbnN0IHN0cmlwcGVkID0gdGhpcy5zdHJpcFN0cmluZ1RvTWF4TGVuZ3RoKGRhdGEuc3RyZWV0KTtcclxuXHJcbiAgICBjb25zdCBhZGRyID0gbmV3IEFkZHJlc3MoKTtcclxuICAgIGFkZHIuY2l0eSA9IGRhdGEuY2l0eTtcclxuICAgIC8vIEdlb0NvZGVyIGlzIG9ubHkgZm9yIEJDLCBDYW5hZGEsIHZhbHVlcyBjYW4gYmUgc2V0LlxyXG4gICAgYWRkci5jb3VudHJ5ID0gQ0FOQURBOyAvLyBEZWZhdWx0IGNvdW50cnkgaXMgQ2FuZGFcclxuICAgIGFkZHIucHJvdmluY2UgPSBCUklUSVNIX0NPTFVNQklBOyAgLy8gRGVmYXVsdCBwcm92aW5jZSBpcyBCQ1xyXG4gICAgYWRkci5zdHJlZXQgPSBzdHJpcHBlZDtcclxuICAgIC8vIFNhdmUgYW5kIGVtaXQgQWRkcmVzcyBmb3IgKHNlbGVjdClcclxuICAgIHRoaXMuc2VsZWN0ZWRBZGRyZXNzID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0LmVtaXQoYWRkcik7XHJcblxyXG4gICAgdGhpcy5fb25DaGFuZ2Uoc3RyaXBwZWQpO1xyXG4gIH1cclxuXHJcbiAgb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gRmlsdGVyIG91dCAnZW50ZXInIGFuZCBvdGhlciBzaW1pbGFyIGtleWJvYXJkIGV2ZW50cyB0aGF0IGNhbiB0cmlnZ2VyXHJcbiAgICAvLyB3aGVuIHVzZXIgaXMgc2VsZWN0aW5nIGEgdHlwZWFoZWFkIG9wdGlvbiBpbnN0ZWFkIG9mIGVudGVyaW5nIG5ldyB0ZXh0LlxyXG4gICAgLy8gV2l0aG91dCB0aGlzIGZpbHRlciwgd2UgZG8gYW5vdGhlciBIVFRQIHJlcXVlc3QgKyBmb3JjZSBkaXNpcGxheSB0aGUgVUlcclxuICAgIC8vIGZvciBub3cgcmVhc29uXHJcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMgfHwgZXZlbnQua2V5Q29kZSA9PT0gOSkgeyAgLy8gZW50ZXIgJiB0YWJcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gQ2xlYXIgb3V0IHNlbGVjdGlvblxyXG4gICAgdGhpcy5zZWxlY3RlZEFkZHJlc3MgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VhcmNoVGV4dCQubmV4dCh0aGlzLnNlYXJjaCk7XHJcbiAgfVxyXG5cclxuICBvbkJsdXIoZXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX29uVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5fb25DaGFuZ2UodGhpcy5zZWFyY2gpO1xyXG4gIH1cclxuXHJcblxyXG4gIHdyaXRlVmFsdWUoIHZhbHVlOiBhbnkgKTogdm9pZCB7XHJcbiAgICBpZiAoIHZhbHVlICAhPT0gdW5kZWZpbmVkICkge1xyXG4gICAgICB0aGlzLnNlYXJjaCA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUmVnaXN0ZXIgY2hhbmdlIGZ1bmN0aW9uXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZSggZm46IGFueSApOiB2b2lkIHtcclxuICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICAvLyBSZWdpc3RlciB0b3VjaGVkIGZ1bmN0aW9uXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoIGZuOiBhbnkgKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RyaXBTdHJpbmdUb01heExlbmd0aChzdHI6IHN0cmluZykge1xyXG4gICAgY29uc3QgbWF4bGVuZ3RoID0gcGFyc2VJbnQodGhpcy5tYXhsZW5ndGgsIDEwKTtcclxuICAgIHJldHVybiBzdHIuc2xpY2UoMCwgbWF4bGVuZ3RoKTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==