UNPKG

ng-fveh

Version:

NG-FVEH - Some helpers to help you with form validation :)

320 lines (304 loc) 37.6 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common')) : typeof define === 'function' && define.amd ? define('ng-fveh', ['exports', '@angular/core', '@angular/common'], factory) : (factory((global['ng-fveh'] = {}),global.ng.core,global.ng.common)); }(this, (function (exports,i0,common) { 'use strict'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var /** @type {?} */ ERROR_MESSAGES_CONFIGURATION = new i0.InjectionToken('MessagesConfiguration'); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var NgFvehLibService = /** @class */ (function () { function NgFvehLibService(messagesObject) { this.messagesObject = messagesObject; } /** * @param {?} errorType * @param {?} errorPayload * @return {?} */ NgFvehLibService.prototype.getMessage = /** * @param {?} errorType * @param {?} errorPayload * @return {?} */ function (errorType, errorPayload) { var /** @type {?} */ message = this.messagesObject[errorType](errorPayload); return message; }; NgFvehLibService.decorators = [ { type: i0.Injectable, args: [{ providedIn: 'root', },] }, ]; /** @nocollapse */ NgFvehLibService.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: i0.Inject, args: [ERROR_MESSAGES_CONFIGURATION,] }] } ]; }; /** @nocollapse */ NgFvehLibService.ngInjectableDef = i0.defineInjectable({ factory: function NgFvehLibService_Factory() { return new NgFvehLibService(i0.inject(ERROR_MESSAGES_CONFIGURATION)); }, token: NgFvehLibService, providedIn: "root" }); return NgFvehLibService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var ErrorsPresenterComponent = /** @class */ (function () { function ErrorsPresenterComponent(service) { this.service = service; } /** * @return {?} */ ErrorsPresenterComponent.prototype.getFieldErrors = /** * @return {?} */ function () { return Object.keys(this.field.errors); }; /** * @param {?} errorPropertyName * @return {?} */ ErrorsPresenterComponent.prototype.getErrorMessage = /** * @param {?} errorPropertyName * @return {?} */ function (errorPropertyName) { var /** @type {?} */ errorPayload = this.field.errors[errorPropertyName]; return this.service.getMessage(errorPropertyName, errorPayload); }; /** * @return {?} */ ErrorsPresenterComponent.prototype.hasErrors = /** * @return {?} */ function () { return this.field.touched && this.field.invalid && !!this.field.errors; }; ErrorsPresenterComponent.decorators = [ { type: i0.Component, args: [{ selector: 'fveh-errors-presenter', template: "<div *ngIf=\"hasErrors()\">\n <div *ngFor=\"let error of getFieldErrors()\">{{ getErrorMessage(error) }}</div>\n</div>", styles: [""], },] }, ]; /** @nocollapse */ ErrorsPresenterComponent.ctorParameters = function () { return [ { type: NgFvehLibService } ]; }; ErrorsPresenterComponent.propDecorators = { field: [{ type: i0.Input }] }; return ErrorsPresenterComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var NgFvehLibModule = /** @class */ (function () { function NgFvehLibModule() { } NgFvehLibModule.decorators = [ { type: i0.NgModule, args: [{ imports: [common.CommonModule], exports: [ErrorsPresenterComponent], declarations: [ErrorsPresenterComponent], },] }, ]; /** @nocollapse */ NgFvehLibModule.ctorParameters = function () { return []; }; return NgFvehLibModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @param {?} controls * @return {?} */ function markControlsAsTouched(controls) { Object.keys(controls).forEach(function (field) { var /** @type {?} */ formGroup = /** @type {?} */ (controls[field]); if (formGroup.controls) { var /** @type {?} */ groupControls = formGroup.controls; markControlsAsTouched(groupControls); } else { formGroup.markAsTouched({ onlySelf: true }); } }); } /** * @param {?} formName * @return {?} */ function FvehFormIsValid(formName) { return function (target, decoratedPropOrFunctionName, descriptor) { var /** @type {?} */ originalMethod = descriptor.value; descriptor.value = function () { var /** @type {?} */ form = this[formName]; if (form.valid) { originalMethod.apply(this, arguments); } else { markControlsAsTouched(form.controls); } }; return descriptor; }; } /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. ***************************************************************************** */ function __read(o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; } /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @param {?} errors * @param {?} control * @return {?} */ function setErrors(errors, control) { if (Object.keys(errors).length) { control.setErrors(errors); } else { control.setErrors(null); } } /** * @param {?} error * @param {?} controls * @return {?} */ function setErrorOnFields(error, controls) { Object.keys(controls).forEach(function (controlName) { var /** @type {?} */ errors = Object.assign({}, controls[controlName].errors, error); setErrors(errors, controls[controlName]); }); } /** * @param {?} fieldErrorName * @param {?} controls * @return {?} */ function clearErrorOnFields(fieldErrorName, controls) { Object.keys(controls).forEach(function (controlName) { var /** @type {?} */ errors = controls[controlName].errors; if (errors) { delete errors[fieldErrorName]; setErrors(errors, controls[controlName]); } }); } /** * @param {?} friendlyFieldNames * @return {?} */ function createGroupMatchError(friendlyFieldNames) { return { fvehGroupMatch: { fields: friendlyFieldNames, }, }; } /** * @param {?} controlValues * @return {?} */ function validateIfValuesMatch(controlValues) { var _a = __read(Object.keys(controlValues)), firstField = _a[0], otherFields = _a.slice(1); var /** @type {?} */ isValid = otherFields.every(function (currentValue) { return controlValues[firstField] === controlValues[currentValue]; }); return isValid; } /** * @param {?} friendlyFieldNames * @return {?} */ function groupMatch(friendlyFieldNames) { return function (_a) { var value = _a.value, touched = _a.touched, pristine = _a.pristine, controls = _a.controls; var /** @type {?} */ error = createGroupMatchError(friendlyFieldNames); var /** @type {?} */ isGroupMatching = validateIfValuesMatch(value); if (pristine) { return null; } if (touched && isGroupMatching) { clearErrorOnFields('fvehGroupMatch', controls); return null; } setErrorOnFields(error, controls); return error; }; } /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var FvehValidators = /** @class */ (function () { function FvehValidators() { } FvehValidators.groupMatch = groupMatch; return FvehValidators; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ exports.NgFvehLibService = NgFvehLibService; exports.ERROR_MESSAGES_CONFIGURATION = ERROR_MESSAGES_CONFIGURATION; exports.NgFvehLibModule = NgFvehLibModule; exports.FvehFormIsValid = FvehFormIsValid; exports.FvehValidators = FvehValidators; exports.ɵb = ErrorsPresenterComponent; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZnZlaC51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL25nLWZ2ZWgvbGliL0luamVjdG9ycy50cyIsIm5nOi8vbmctZnZlaC9saWIvbmctZnZlaC1saWIuc2VydmljZS50cyIsIm5nOi8vbmctZnZlaC9saWIvY29tcG9uZW50cy9lcnJvcnMtcHJlc2VudGVyL2Vycm9ycy1wcmVzZW50ZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZy1mdmVoL2xpYi9uZy1mdmVoLWxpYi5tb2R1bGUudHMiLCJuZzovL25nLWZ2ZWgvbGliL2RlY29yYXRvcnMvZm9ybS1pcy12YWxpZC5kZWNvcmF0b3IudHMiLG51bGwsIm5nOi8vbmctZnZlaC9saWIvdmFsaWRhdG9ycy9ncm91cC1tYXRjaC52YWxpZGF0b3IudHMiLCJuZzovL25nLWZ2ZWgvbGliL3ZhbGlkYXRvcnMvZnZlaC52YWxpZGF0b3JzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2VzIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuXHJcbmV4cG9ydCBjb25zdCBFUlJPUl9NRVNTQUdFU19DT05GSUdVUkFUSU9OID0gbmV3IEluamVjdGlvblRva2VuPE1lc3NhZ2VzPihcclxuICAnTWVzc2FnZXNDb25maWd1cmF0aW9uJyxcclxuKTtcclxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2VzIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgRVJST1JfTUVTU0FHRVNfQ09ORklHVVJBVElPTiB9IGZyb20gJy4vSW5qZWN0b3JzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ0Z2ZWhMaWJTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoRVJST1JfTUVTU0FHRVNfQ09ORklHVVJBVElPTikgcHVibGljIG1lc3NhZ2VzT2JqZWN0OiBNZXNzYWdlcyxcclxuICApIHt9XHJcblxyXG4gIGdldE1lc3NhZ2UoZXJyb3JUeXBlOiBzdHJpbmcsIGVycm9yUGF5bG9hZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc09iamVjdFtlcnJvclR5cGVdKGVycm9yUGF5bG9hZCk7XHJcbiAgICByZXR1cm4gbWVzc2FnZTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdGdmVoTGliU2VydmljZSB9IGZyb20gJy4uLy4uL25nLWZ2ZWgtbGliLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmdmVoLWVycm9ycy1wcmVzZW50ZXInLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiAqbmdJZj1cImhhc0Vycm9ycygpXCI+XHJcbiAgPGRpdiAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgZ2V0RmllbGRFcnJvcnMoKVwiPnt7IGdldEVycm9yTWVzc2FnZShlcnJvcikgfX08L2Rpdj5cclxuPC9kaXY+YCxcclxuICBzdHlsZXM6IFtgYF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFcnJvcnNQcmVzZW50ZXJDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGZpZWxkOiBGb3JtQ29udHJvbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHNlcnZpY2U6IE5nRnZlaExpYlNlcnZpY2UpIHt9XHJcblxyXG4gIGdldEZpZWxkRXJyb3JzKCkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmllbGQuZXJyb3JzKTtcclxuICB9XHJcblxyXG4gIGdldEVycm9yTWVzc2FnZShlcnJvclByb3BlcnR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBlcnJvclBheWxvYWQgPSB0aGlzLmZpZWxkLmVycm9yc1tlcnJvclByb3BlcnR5TmFtZV07XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmdldE1lc3NhZ2UoZXJyb3JQcm9wZXJ0eU5hbWUsIGVycm9yUGF5bG9hZCk7XHJcbiAgfVxyXG5cclxuICBoYXNFcnJvcnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZC50b3VjaGVkICYmIHRoaXMuZmllbGQuaW52YWxpZCAmJiAhIXRoaXMuZmllbGQuZXJyb3JzO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycywgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRXJyb3JzUHJlc2VudGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Vycm9ycy1wcmVzZW50ZXIvZXJyb3JzLXByZXNlbnRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFUlJPUl9NRVNTQUdFU19DT05GSUdVUkFUSU9OIH0gZnJvbSAnLi9JbmplY3RvcnMnO1xyXG4vLyBpbXBvcnQgeyBOZ0Z2ZWhMaWJTZXJ2aWNlIH0gZnJvbSAnLi9uZy1mdmVoLWxpYi5zZXJ2aWNlJztcclxuLy8gaW1wb3J0IHsgTWVzc2FnZXMgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICBleHBvcnRzOiBbRXJyb3JzUHJlc2VudGVyQ29tcG9uZW50XSxcclxuICBkZWNsYXJhdGlvbnM6IFtFcnJvcnNQcmVzZW50ZXJDb21wb25lbnRdLFxyXG59KVxyXG5jbGFzcyBOZ0Z2ZWhMaWJNb2R1bGUge1xyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjM2MDlcclxuICAvLyBwdWJsaWMgc3RhdGljIGZvclJvb3QoXHJcbiAgLy8gICBtZXNzYWdlc0RpY3Rpb25hcnk6IE1lc3NhZ2VzID0ge30sXHJcbiAgLy8gKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XHJcbiAgLy8gICByZXR1cm4ge1xyXG4gIC8vICAgICBuZ01vZHVsZTogTmdGdmVoTGliTW9kdWxlLFxyXG4gIC8vICAgICBwcm92aWRlcnM6IFtcclxuICAvLyAgICAgICB7IHByb3ZpZGU6ICdNRVNTQUdFU19DT05GSUdVUkFUSU9OJywgdXNlVmFsdWU6IG1lc3NhZ2VzRGljdGlvbmFyeSB9LCAvLyBBT1QgQlVHXHJcbiAgLy8gICAgICAgTmdGdmVoTGliU2VydmljZSxcclxuICAvLyAgICAgXSxcclxuICAvLyAgIH07XHJcbiAgLy8gfVxyXG59XHJcblxyXG5leHBvcnQgeyBFUlJPUl9NRVNTQUdFU19DT05GSUdVUkFUSU9OLCBOZ0Z2ZWhMaWJNb2R1bGUgfTtcclxuIiwiaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5mdW5jdGlvbiBtYXJrQ29udHJvbHNBc1RvdWNoZWQoY29udHJvbHM6IHsgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sIH0pIHtcclxuICBPYmplY3Qua2V5cyhjb250cm9scykuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sc1tmaWVsZF0gYXMgRm9ybUdyb3VwO1xyXG5cclxuICAgIGlmIChmb3JtR3JvdXAuY29udHJvbHMpIHtcclxuICAgICAgY29uc3QgZ3JvdXBDb250cm9scyA9IGZvcm1Hcm91cC5jb250cm9scztcclxuICAgICAgbWFya0NvbnRyb2xzQXNUb3VjaGVkKGdyb3VwQ29udHJvbHMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9ybUdyb3VwLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEZ2ZWhGb3JtSXNWYWxpZChmb3JtTmFtZTogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uKFxyXG4gICAgdGFyZ2V0OiBhbnksXHJcbiAgICBkZWNvcmF0ZWRQcm9wT3JGdW5jdGlvbk5hbWU6IHN0cmluZyxcclxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcixcclxuICApIHtcclxuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcclxuXHJcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzW2Zvcm1OYW1lXTtcclxuICAgICAgaWYgKGZvcm0udmFsaWQpIHtcclxuICAgICAgICBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hcmtDb250cm9sc0FzVG91Y2hlZChmb3JtLmNvbnRyb2xzKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcclxuICB9O1xyXG59XHJcbiIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xyXG4gICAgcmVzdWx0LmRlZmF1bHQgPSBtb2Q7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG4iLCJpbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmludGVyZmFjZSBGb3JtQ29udHJvbHMge1xyXG4gIFtrZXk6IHN0cmluZ106IEZvcm1Db250cm9sO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRFcnJvcnMoZXJyb3JzOiBhbnksIGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XHJcbiAgaWYgKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoKSB7XHJcbiAgICBjb250cm9sLnNldEVycm9ycyhlcnJvcnMpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb250cm9sLnNldEVycm9ycyhudWxsKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldEVycm9yT25GaWVsZHMoZXJyb3I6IHt9IHwgbnVsbCwgY29udHJvbHM6IEZvcm1Db250cm9scykge1xyXG4gIE9iamVjdC5rZXlzKGNvbnRyb2xzKS5mb3JFYWNoKGNvbnRyb2xOYW1lID0+IHtcclxuICAgIGNvbnN0IGVycm9ycyA9IE9iamVjdC5hc3NpZ24oe30sIGNvbnRyb2xzW2NvbnRyb2xOYW1lXS5lcnJvcnMsIGVycm9yKTtcclxuICAgIHNldEVycm9ycyhlcnJvcnMsIGNvbnRyb2xzW2NvbnRyb2xOYW1lXSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsZWFyRXJyb3JPbkZpZWxkcyhmaWVsZEVycm9yTmFtZTogc3RyaW5nLCBjb250cm9sczogRm9ybUNvbnRyb2xzKSB7XHJcbiAgT2JqZWN0LmtleXMoY29udHJvbHMpLmZvckVhY2goY29udHJvbE5hbWUgPT4ge1xyXG4gICAgY29uc3QgZXJyb3JzID0gY29udHJvbHNbY29udHJvbE5hbWVdLmVycm9ycztcclxuICAgIGlmIChlcnJvcnMpIHtcclxuICAgICAgZGVsZXRlIGVycm9yc1tmaWVsZEVycm9yTmFtZV07XHJcbiAgICAgIHNldEVycm9ycyhlcnJvcnMsIGNvbnRyb2xzW2NvbnRyb2xOYW1lXSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUdyb3VwTWF0Y2hFcnJvcihmcmllbmRseUZpZWxkTmFtZXM6IHN0cmluZ1tdKSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGZ2ZWhHcm91cE1hdGNoOiB7XHJcbiAgICAgIGZpZWxkczogZnJpZW5kbHlGaWVsZE5hbWVzLFxyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiB2YWxpZGF0ZUlmVmFsdWVzTWF0Y2goY29udHJvbFZhbHVlczogYW55KSB7XHJcbiAgY29uc3QgW2ZpcnN0RmllbGQsIC4uLm90aGVyRmllbGRzXSA9IE9iamVjdC5rZXlzKGNvbnRyb2xWYWx1ZXMpO1xyXG4gIGNvbnN0IGlzVmFsaWQgPSBvdGhlckZpZWxkcy5ldmVyeShcclxuICAgIGN1cnJlbnRWYWx1ZSA9PiBjb250cm9sVmFsdWVzW2ZpcnN0RmllbGRdID09PSBjb250cm9sVmFsdWVzW2N1cnJlbnRWYWx1ZV0sXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuIGlzVmFsaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBncm91cE1hdGNoKGZyaWVuZGx5RmllbGROYW1lczogc3RyaW5nW10pIHtcclxuICByZXR1cm4gKHsgdmFsdWUsIHRvdWNoZWQsIHByaXN0aW5lLCBjb250cm9scyB9KSA9PiB7XHJcbiAgICBjb25zdCBlcnJvciA9IGNyZWF0ZUdyb3VwTWF0Y2hFcnJvcihmcmllbmRseUZpZWxkTmFtZXMpO1xyXG4gICAgY29uc3QgaXNHcm91cE1hdGNoaW5nID0gdmFsaWRhdGVJZlZhbHVlc01hdGNoKHZhbHVlKTtcclxuXHJcbiAgICBpZiAocHJpc3RpbmUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRvdWNoZWQgJiYgaXNHcm91cE1hdGNoaW5nKSB7XHJcbiAgICAgIGNsZWFyRXJyb3JPbkZpZWxkcygnZnZlaEdyb3VwTWF0Y2gnLCBjb250cm9scyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEVycm9yT25GaWVsZHMoZXJyb3IsIGNvbnRyb2xzKTtcclxuICAgIHJldHVybiBlcnJvcjtcclxuICB9O1xyXG59XHJcbiIsImltcG9ydCB7IGdyb3VwTWF0Y2ggfSBmcm9tICcuL2dyb3VwLW1hdGNoLnZhbGlkYXRvcic7XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgRnZlaFZhbGlkYXRvcnMge1xyXG4gIHN0YXRpYyBncm91cE1hdGNoID0gZ3JvdXBNYXRjaDtcclxufVxyXG4iXSwibmFtZXMiOlsiSW5qZWN0aW9uVG9rZW4iLCJJbmplY3RhYmxlIiwiSW5qZWN0IiwiQ29tcG9uZW50IiwiSW5wdXQiLCJOZ01vZHVsZSIsIkNvbW1vbk1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLHlCQUdhLDRCQUE0QixHQUFHLElBQUlBLGlCQUFjLENBQzVELHVCQUF1QixDQUN4Qjs7Ozs7O0FDTEQ7UUFRRSwwQkFDK0MsY0FBd0I7WUFBeEIsbUJBQWMsR0FBZCxjQUFjLENBQVU7U0FDbkU7Ozs7OztRQUVKLHFDQUFVOzs7OztZQUFWLFVBQVcsU0FBaUIsRUFBRSxZQUFvQztnQkFDaEUscUJBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzdELE9BQU8sT0FBTyxDQUFDO2FBQ2hCOztvQkFYRkMsYUFBVSxTQUFDO3dCQUNWLFVBQVUsRUFBRSxNQUFNO3FCQUNuQjs7Ozs7d0RBR0lDLFNBQU0sU0FBQyw0QkFBNEI7Ozs7K0JBVHhDOzs7Ozs7O0FDQUE7UUFjRSxrQ0FBbUIsT0FBeUI7WUFBekIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7U0FBSTs7OztRQUVoRCxpREFBYzs7O1lBQWQ7Z0JBQ0UsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdkM7Ozs7O1FBRUQsa0RBQWU7Ozs7WUFB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