UNPKG

acr-assist-simulator-module

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.

268 lines (267 loc) 33.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Component, Input } from '@angular/core'; import { ChoiceDataElement } from '../../../core/elements/models/choice-data-element-model'; import { DomSanitizer } from '@angular/platform-browser'; export class ImageMapComponent { /** * @param {?} domSanitizer */ constructor(domSanitizer) { this.$ = require('jquery'); this.DataElements = {}; this.FormValues = {}; this.isDataURL = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i; this.imageExist = true; this.SelectionValue = ''; this.domSanitizer = domSanitizer; } /** * @return {?} */ ngOnInit() { if (this.DataElement === undefined) { return; } this.displayValue(''); } /** * @param {?} mouseX * @param {?} mouseY * @param {?} Coordinates * @return {?} */ isInRectangle(mouseX, mouseY, Coordinates) { const /** @type {?} */ COArray = Coordinates.split(','); if (COArray[0] < mouseX && (COArray[0] + COArray[2]) > mouseX && COArray[1] < mouseY && (COArray[1] + COArray[3]) > mouseY) { return true; } return false; } /** * @param {?} mouseX * @param {?} mouseY * @param {?} Coordinates * @return {?} */ isInCircle(mouseX, mouseY, Coordinates) { const /** @type {?} */ COArray = Coordinates.split(','); if (Math.sqrt(Math.pow((mouseX - COArray[0]), 2) + Math.pow((mouseY - COArray[1]), 2)) < COArray[2]) { return true; } else { return false; } } /** * @param {?} x * @param {?} y * @param {?} Coordinates * @return {?} */ isInPolygon(x, y, Coordinates) { const /** @type {?} */ COArray = Coordinates.split(','); const /** @type {?} */ vs = []; for (let /** @type {?} */ i = 0; i < COArray.length; i++) { const /** @type {?} */ point = []; point.push(COArray[i]); point.push(COArray[i + 1]); i += 1; vs.push(point); } let /** @type {?} */ inside = false; for (let /** @type {?} */ i = 0, /** @type {?} */ j = vs.length - 1; i < vs.length; j = i++) { const /** @type {?} */ xi = vs[i][0], /** @type {?} */ yi = vs[i][1]; const /** @type {?} */ xj = vs[j][0], /** @type {?} */ yj = vs[j][1]; const /** @type {?} */ intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); if (intersect) { inside = !inside; } } return inside; } /** * @param {?} e * @param {?} dataElement * @return {?} */ imageClick(e, dataElement) { const /** @type {?} */ O_height = dataElement.ImageProp.height; const /** @type {?} */ O_width = dataElement.ImageProp.width; const /** @type {?} */ $elem = this.$(e.target); const /** @type {?} */ N_height = $elem.height(); const /** @type {?} */ N_width = $elem.width(); const /** @type {?} */ offset = $elem.offset(); const /** @type {?} */ offset_t = offset.top - this.$(window).scrollTop(); const /** @type {?} */ offset_l = offset.left - this.$(window).scrollLeft(); const /** @type {?} */ x = e.clientX - offset_l; const /** @type {?} */ y = e.clientY - offset_t; for (const /** @type {?} */ opt of dataElement.ImageOptions) { if (opt.Shape === 'rect') { if (this.isInRectangle(x, y, opt.Coordinates)) { this.FormValues[dataElement.ID] = opt.Value; break; } } else if (opt.Shape === 'circle') { if (this.isInCircle(x, y, opt.Coordinates)) { this.FormValues[dataElement.ID] = opt.Value; break; } } else if (opt.Shape === 'poly') { if (this.isInPolygon(x, y, opt.Coordinates)) { this.FormValues[dataElement.ID] = opt.Value; break; } } } } /** * @param {?} val * @return {?} */ setValue(val) { for (const /** @type {?} */ optValue of this.DataElement.choiceInfo) { if (this.DataElement.choiceInfo.length <= 5 && this.DataElement.choiceInfo.length > 0) { if (optValue.value === val) { this.$('#' + val + '_' + this.DataElement.id).prop('checked', true); const /** @type {?} */ customEvent = document.createEvent('Event'); customEvent.initEvent('change', true, true); this.$('#' + val + '_' + this.DataElement.id)[0].dispatchEvent(customEvent); } else { this.$('#' + optValue.value + '_' + this.DataElement.id).prop('checked', false); } } else { if (optValue.value === val) { this.$('#' + this.DataElement.id).val(optValue.value); const /** @type {?} */ customEvent = document.createEvent('Event'); customEvent.initEvent('change', true, true); this.$('#' + this.DataElement.id)[0].dispatchEvent(customEvent); break; } } } this.DataElement.currentValue = val; // this.FormValues[this.DataElement.id] = val; } /** * @param {?} val * @return {?} */ displayValue(val) { if (val === '') { this.SelectionValue = 'Image Map Diagram'; } else { this.SelectionValue = 'Selected Value : ' + val; } } /** * @param {?} location * @return {?} */ getImageDataUrl(location) { const /** @type {?} */ isDataURL = !!location.match(this.isDataURL); if (isDataURL) { location = location.replace('unsafe:', ''); return location; } else { return this.imagePath + '/' + location; } } } ImageMapComponent.decorators = [ { type: Component, args: [{ selector: 'acr-image-map', template: `<div class="col-sm-8"> <label class="control-label font-weight-400">Not sure? try out this image </label> <button type="button" class="btn btn-default" data-toggle="modal" attr.data-target="#{{'imgMap_Modal_'+DataElement.id}}"> <span class="glyphicon glyphicon-picture" aria-hidden="true" data-toggle="tooltip" data-placement="top" title="Image Map"></span> </button> </div> <ng-container *ngIf="imagePath != undefined"> <div class="modal inmodal fade" id="{{'imgMap_Modal_'+DataElement.id}}" tabindex="-1" role="dialog" aria-hidden="true"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal"> <span aria-hidden="true">&times;</span> <span class="sr-only">Close</span> </button> <h4 class="modal-title"> {{SelectionValue}}</h4> </div> <div class="modal-body"> <div class="row"> <div class="col-md-12"> <ng-container *ngIf="imageExist == true"> <img class="ImgOption danger img-responsive max-w-h-100" alt="{{ DataElement.imageMap.label }}" data-dismiss="modal" attr.id="{{'imgMap_Img_'+DataElement.id}}" (click)="imageClick($event,DataElement);" attr.data-elementID="{{DataElement.id}}" attr.usemap="#{{'imgMap_'+DataElement.id}}" [src]="domSanitizer.bypassSecurityTrustUrl(getImageDataUrl(DataElement.imageMap.location))"> <map name="{{'imgMap_'+DataElement.id}}"> <ng-container *ngFor="let imgOpt of DataElement.imageMap.map.areas"> <area attr.shape="{{imgOpt.shape}}" attr.imgID="{{'imgMap_Img_'+DataElement.id}}" attr.coords="{{imgOpt.coords}}" attr.alt="{{imgOpt.choiceValue}}" (mouseover)='displayValue(imgOpt.choiceValue);' (mouseout)='displayValue("");' (click)="setValue(imgOpt.choiceValue);" data-dismiss="modal"> </ng-container> </map> </ng-container> <ng-container *ngIf="imageExist == false"> <div class=""> No Image Map Available... </div> </ng-container> </div> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-primary" data-dismiss="modal">Close</button> </div> </div> </div> </div> </ng-container> `, styles: [``, `.required-field{color:red}.padding-l-5{padding-left:5px}.whitespace{margin-left:5px}.max-w-h-100{max-width:100%;max-height:100%}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.carousel-control.left{background-repeat:repeat-x}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control.right{background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.scroll{overflow-y:scroll;overflow-x:hidden}.div-simulator-form-height{height:calc(100vh - 100px);overflow-y:scroll;overflow-x:hidden}.div-report-text-scroll{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 300px)}.padding-r-10{padding-right:10px}.slide-left{left:30px}.slide-right{right:30px}hr{margin-top:10px;margin-bottom:10px}.white-space-line{white-space:pre-line;word-wrap:break-word}p{margin:0 0 10px}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}h4.modal-title.float-left{float:left}.margin-b-0{margin-bottom:0}.font-weight-400{font-weight:400}.custom-radio-style{float:left;margin-right:15px}.zoom{width:100%;overflow:auto}.zoom img{height:auto;width:100%;min-width:100%;max-width:inherit!important}.btn-zoom{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-zoom.hover,.btn-zoom:active,.btn-zoom:hover{background-color:#e7e7e7}@media (min-width:768px){label.control-label{padding-left:20px}}.padding-5{padding:5px}`] },] }, ]; /** @nocollapse */ ImageMapComponent.ctorParameters = () => [ { type: DomSanitizer } ]; ImageMapComponent.propDecorators = { DataElement: [{ type: Input }], DataElements: [{ type: Input }], FormValues: [{ type: Input }], imagePath: [{ type: Input }] }; function ImageMapComponent_tsickle_Closure_declarations() { /** @type {?} */ ImageMapComponent.prototype.$; /** @type {?} */ ImageMapComponent.prototype.DataElement; /** @type {?} */ ImageMapComponent.prototype.DataElements; /** @type {?} */ ImageMapComponent.prototype.FormValues; /** @type {?} */ ImageMapComponent.prototype.imagePath; /** @type {?} */ ImageMapComponent.prototype.isDataURL; /** @type {?} */ ImageMapComponent.prototype.domSanitizer; /** @type {?} */ ImageMapComponent.prototype.imageExist; /** @type {?} */ ImageMapComponent.prototype.SelectionValue; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtbWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2ltYWdlLW1hcC9pbWFnZS1tYXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFXLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUF5RHpELE1BQU07Ozs7SUFXRixZQUFZLFlBQTBCO2lCQVZsQyxPQUFPLENBQUMsUUFBUSxDQUFDOzRCQUVXLEVBQUU7MEJBQ0osRUFBRTt5QkFFcEIsdUhBQXVIOzBCQUV0SCxJQUFJOzhCQUNBLEVBQUU7UUFHZixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztLQUNwQzs7OztJQUVELFFBQVE7UUFFSixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDO1NBQ1Y7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ3pCOzs7Ozs7O0lBRUQsYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVztRQUNyQyx1QkFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTTtlQUNoQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNO2VBQ2xDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNO2VBQ25CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQztTQUNmO1FBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQztLQUNoQjs7Ozs7OztJQUVELFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVc7UUFDbEMsdUJBQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xHLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDZjtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osTUFBTSxDQUFDLEtBQUssQ0FBQztTQUNoQjtLQUNKOzs7Ozs7O0lBRUQsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVztRQUN6Qix1QkFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2Qyx1QkFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMscUJBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLHVCQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ1AsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQjtRQUNELHFCQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsR0FBRyxDQUFDLENBQUMscUJBQUksQ0FBQyxHQUFHLENBQUMsbUJBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hELHVCQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsdUJBQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyx1QkFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzttQkFDbEMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDbkQsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDWixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7YUFDcEI7U0FDSjtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7S0FDakI7Ozs7OztJQUVELFVBQVUsQ0FBQyxDQUFDLEVBQUUsV0FBVztRQUNyQix1QkFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDOUMsdUJBQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQzVDLHVCQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvQix1QkFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hDLHVCQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFHOUIsdUJBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUU5Qix1QkFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3pELHVCQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFM0QsdUJBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBQy9CLHVCQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUMvQixHQUFHLENBQUMsQ0FBQyx1QkFBTSxHQUFHLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDekMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztvQkFDNUMsS0FBSyxDQUFDO2lCQUNUO2FBQ0o7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztvQkFDNUMsS0FBSyxDQUFDO2lCQUNUO2FBQ0o7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztvQkFDNUMsS0FBSyxDQUFDO2lCQUNUO2FBQ0o7U0FFSjtLQUVKOzs7OztJQUVELFFBQVEsQ0FBQyxHQUFHO1FBQ1IsR0FBRyxDQUFDLENBQUMsdUJBQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNqRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRixFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNwRSx1QkFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbEQsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUM1QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUMvRTtnQkFBQyxJQUFJLENBQUMsQ0FBQztvQkFDSixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ25GO2FBQ0o7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdEQsdUJBQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2xELFdBQVcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ2hFLEtBQUssQ0FBQztpQkFDVDthQUNKO1NBQ0o7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7O0tBRXZDOzs7OztJQUVELFlBQVksQ0FBQyxHQUFHO1FBQ1osRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDYixJQUFJLENBQUMsY0FBYyxHQUFHLG1CQUFtQixDQUFDO1NBQzdDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsY0FBYyxHQUFHLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztTQUNuRDtLQUNKOzs7OztJQUVELGVBQWUsQ0FBQyxRQUFnQjtRQUM1Qix1QkFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDaEIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxRQUFRLENBQUM7U0FDakI7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7U0FDeEM7S0FDRjs7O1lBdE1OLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsZUFBZTtnQkFDekIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQStDWDtnQkFDQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsazdDQUFrN0MsQ0FBQzthQUNqOEM7Ozs7WUF2RFEsWUFBWTs7OzBCQTJEaEIsS0FBSzsyQkFDTCxLQUFLO3lCQUNMLEtBQUs7d0JBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0ICwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2RhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5cclxuZGVjbGFyZSB2YXIgcmVxdWlyZTogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItaW1hZ2UtbWFwJyxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgZm9udC13ZWlnaHQtNDAwXCI+Tm90IHN1cmU/IHRyeSBvdXQgdGhpcyBpbWFnZSA8L2xhYmVsPlxyXG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGF0dHIuZGF0YS10YXJnZXQ9XCIje3snaW1nTWFwX01vZGFsXycrRGF0YUVsZW1lbnQuaWR9fVwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXBpY3R1cmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiBkYXRhLXBsYWNlbWVudD1cInRvcFwiIHRpdGxlPVwiSW1hZ2UgTWFwXCI+PC9zcGFuPlxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlUGF0aCAhPSB1bmRlZmluZWRcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwgaW5tb2RhbCBmYWRlXCIgaWQ9XCJ7eydpbWdNYXBfTW9kYWxfJytEYXRhRWxlbWVudC5pZH19XCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cclxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+IHt7U2VsZWN0aW9uVmFsdWV9fTwvaDQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWFnZUV4aXN0ID09IHRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cIkltZ09wdGlvbiBkYW5nZXIgaW1nLXJlc3BvbnNpdmUgbWF4LXctaC0xMDBcIiBhbHQ9XCJ7eyBEYXRhRWxlbWVudC5pbWFnZU1hcC5sYWJlbCB9fVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXR0ci5pZD1cInt7J2ltZ01hcF9JbWdfJytEYXRhRWxlbWVudC5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW1hZ2VDbGljaygkZXZlbnQsRGF0YUVsZW1lbnQpO1wiIGF0dHIuZGF0YS1lbGVtZW50SUQ9XCJ7e0RhdGFFbGVtZW50LmlkfX1cIiBhdHRyLnVzZW1hcD1cIiN7eydpbWdNYXBfJytEYXRhRWxlbWVudC5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKGdldEltYWdlRGF0YVVybChEYXRhRWxlbWVudC5pbWFnZU1hcC5sb2NhdGlvbikpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWFwIG5hbWU9XCJ7eydpbWdNYXBfJytEYXRhRWxlbWVudC5pZH19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGltZ09wdCBvZiBEYXRhRWxlbWVudC5pbWFnZU1hcC5tYXAuYXJlYXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YXJlYSBhdHRyLnNoYXBlPVwie3tpbWdPcHQuc2hhcGV9fVwiIGF0dHIuaW1nSUQ9XCJ7eydpbWdNYXBfSW1nXycrRGF0YUVsZW1lbnQuaWR9fVwiIGF0dHIuY29vcmRzPVwie3tpbWdPcHQuY29vcmRzfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ci5hbHQ9XCJ7e2ltZ09wdC5jaG9pY2VWYWx1ZX19XCIgKG1vdXNlb3Zlcik9J2Rpc3BsYXlWYWx1ZShpbWdPcHQuY2hvaWNlVmFsdWUpOycgKG1vdXNlb3V0KT0nZGlzcGxheVZhbHVlKFwiXCIpOydcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRWYWx1ZShpbWdPcHQuY2hvaWNlVmFsdWUpO1wiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9tYXA+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlRXhpc3QgPT0gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgTm8gSW1hZ2UgTWFwIEF2YWlsYWJsZS4uLlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgSW1hZ2VNYXBDb21wb25lbnQgIGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgICQgPSByZXF1aXJlKCdqcXVlcnknKTtcclxuICAgIEBJbnB1dCgpIERhdGFFbGVtZW50OiBDaG9pY2VEYXRhRWxlbWVudDtcclxuICAgIEBJbnB1dCgpIERhdGFFbGVtZW50czogT2JqZWN0ID0ge307XHJcbiAgICBASW5wdXQoKSBGb3JtVmFsdWVzOiBPYmplY3QgPSB7fTtcclxuICAgIEBJbnB1dCgpIGltYWdlUGF0aDogc3RyaW5nO1xyXG4gICAgaXNEYXRhVVJMID0gL15cXHMqZGF0YTooW2Etel0rXFwvW2Etel0rKDtbYS16XFwtXStcXD1bYS16XFwtXSspPyk/KDtiYXNlNjQpPyxbYS16MC05XFwhXFwkXFwmXFwnXFwsXFwoXFwpXFwqXFwrXFwsXFw7XFw9XFwtXFwuXFxfXFx+XFw6XFxAXFwvXFw/XFwlXFxzXSpcXHMqJC9pO1xyXG4gICAgZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXI7XHJcbiAgICBpbWFnZUV4aXN0ID0gdHJ1ZTtcclxuICAgIFNlbGVjdGlvblZhbHVlID0gJyc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcclxuICAgICAgICB0aGlzLmRvbVNhbml0aXplciA9IGRvbVNhbml0aXplcjtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuRGF0YUVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICBpc0luUmVjdGFuZ2xlKG1vdXNlWCwgbW91c2VZLCBDb29yZGluYXRlcykge1xyXG4gICAgICAgIGNvbnN0IENPQXJyYXkgPSBDb29yZGluYXRlcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGlmIChDT0FycmF5WzBdIDwgbW91c2VYXHJcbiAgICAgICAgICAgICYmIChDT0FycmF5WzBdICsgQ09BcnJheVsyXSkgPiBtb3VzZVhcclxuICAgICAgICAgICAgJiYgQ09BcnJheVsxXSA8IG1vdXNlWVxyXG4gICAgICAgICAgICAmJiAoQ09BcnJheVsxXSArIENPQXJyYXlbM10pID4gbW91c2VZKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaXNJbkNpcmNsZShtb3VzZVgsIG1vdXNlWSwgQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICBjb25zdCBDT0FycmF5ID0gQ29vcmRpbmF0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBpZiAoTWF0aC5zcXJ0KE1hdGgucG93KChtb3VzZVggLSBDT0FycmF5WzBdKSwgMikgKyBNYXRoLnBvdygobW91c2VZIC0gQ09BcnJheVsxXSksIDIpKSA8IENPQXJyYXlbMl0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc0luUG9seWdvbih4LCB5LCBDb29yZGluYXRlcykge1xyXG4gICAgICAgIGNvbnN0IENPQXJyYXkgPSBDb29yZGluYXRlcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGNvbnN0IHZzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDT0FycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gW107XHJcbiAgICAgICAgICAgIHBvaW50LnB1c2goQ09BcnJheVtpXSk7XHJcbiAgICAgICAgICAgIHBvaW50LnB1c2goQ09BcnJheVtpICsgMV0pO1xyXG4gICAgICAgICAgICBpICs9IDE7XHJcbiAgICAgICAgICAgIHZzLnB1c2gocG9pbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaW5zaWRlID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSB2cy5sZW5ndGggLSAxOyBpIDwgdnMubGVuZ3RoOyBqID0gaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHhpID0gdnNbaV1bMF0sIHlpID0gdnNbaV1bMV07XHJcbiAgICAgICAgICAgIGNvbnN0IHhqID0gdnNbal1bMF0sIHlqID0gdnNbal1bMV07XHJcbiAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdCA9ICgoeWkgPiB5KSAhPT0gKHlqID4geSkpXHJcbiAgICAgICAgICAgICAgICAmJiAoeCA8ICh4aiAtIHhpKSAqICh5IC0geWkpIC8gKHlqIC0geWkpICsgeGkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZXJzZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnNpZGU7XHJcbiAgICB9XHJcblxyXG4gICAgaW1hZ2VDbGljayhlLCBkYXRhRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IE9faGVpZ2h0ID0gZGF0YUVsZW1lbnQuSW1hZ2VQcm9wLmhlaWdodDtcclxuICAgICAgICBjb25zdCBPX3dpZHRoID0gZGF0YUVsZW1lbnQuSW1hZ2VQcm9wLndpZHRoO1xyXG4gICAgICAgIGNvbnN0ICRlbGVtID0gdGhpcy4kKGUudGFyZ2V0KTtcclxuXHJcbiAgICAgICAgY29uc3QgTl9oZWlnaHQgPSAkZWxlbS5oZWlnaHQoKTtcclxuICAgICAgICBjb25zdCBOX3dpZHRoID0gJGVsZW0ud2lkdGgoKTtcclxuXHJcblxyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9ICRlbGVtLm9mZnNldCgpO1xyXG5cclxuICAgICAgICBjb25zdCBvZmZzZXRfdCA9IG9mZnNldC50b3AgLSB0aGlzLiQod2luZG93KS5zY3JvbGxUb3AoKTtcclxuICAgICAgICBjb25zdCBvZmZzZXRfbCA9IG9mZnNldC5sZWZ0IC0gdGhpcy4kKHdpbmRvdykuc2Nyb2xsTGVmdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB4ID0gZS5jbGllbnRYIC0gb2Zmc2V0X2w7XHJcbiAgICAgICAgY29uc3QgeSA9IGUuY2xpZW50WSAtIG9mZnNldF90O1xyXG4gICAgICAgIGZvciAoY29uc3Qgb3B0IG9mIGRhdGFFbGVtZW50LkltYWdlT3B0aW9ucykge1xyXG4gICAgICAgICAgICBpZiAob3B0LlNoYXBlID09PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5SZWN0YW5nbGUoeCwgeSwgb3B0LkNvb3JkaW5hdGVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRm9ybVZhbHVlc1tkYXRhRWxlbWVudC5JRF0gPSBvcHQuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LlNoYXBlID09PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbkNpcmNsZSh4LCB5LCBvcHQuQ29vcmRpbmF0ZXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Gb3JtVmFsdWVzW2RhdGFFbGVtZW50LklEXSA9IG9wdC5WYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuU2hhcGUgPT09ICdwb2x5Jykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJblBvbHlnb24oeCwgeSwgb3B0LkNvb3JkaW5hdGVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRm9ybVZhbHVlc1tkYXRhRWxlbWVudC5JRF0gPSBvcHQuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBzZXRWYWx1ZSh2YWwpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG9wdFZhbHVlIG9mIHRoaXMuRGF0YUVsZW1lbnQuY2hvaWNlSW5mbykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5EYXRhRWxlbWVudC5jaG9pY2VJbmZvLmxlbmd0aCA8PSA1ICYmIHRoaXMuRGF0YUVsZW1lbnQuY2hvaWNlSW5mby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0VmFsdWUudmFsdWUgPT09IHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyB2YWwgKyAnXycgKyB0aGlzLkRhdGFFbGVtZW50LmlkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXN0b21FdmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyB2YWwgKyAnXycgKyB0aGlzLkRhdGFFbGVtZW50LmlkKVswXS5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKCcjJyArIG9wdFZhbHVlLnZhbHVlICsgJ18nICsgdGhpcy5EYXRhRWxlbWVudC5pZCkucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRWYWx1ZS52YWx1ZSA9PT0gdmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKCcjJyArIHRoaXMuRGF0YUVsZW1lbnQuaWQpLnZhbChvcHRWYWx1ZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXN0b21FdmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyB0aGlzLkRhdGFFbGVtZW50LmlkKVswXS5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkRhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSA9IHZhbDtcclxuICAgICAgICAvLyB0aGlzLkZvcm1WYWx1ZXNbdGhpcy5EYXRhRWxlbWVudC5pZF0gPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcGxheVZhbHVlKHZhbCkge1xyXG4gICAgICAgIGlmICh2YWwgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0aW9uVmFsdWUgPSAnSW1hZ2UgTWFwIERpYWdyYW0nO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0aW9uVmFsdWUgPSAnU2VsZWN0ZWQgVmFsdWUgOiAnICsgdmFsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRJbWFnZURhdGFVcmwobG9jYXRpb246IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgaXNEYXRhVVJMID0gISFsb2NhdGlvbi5tYXRjaCh0aGlzLmlzRGF0YVVSTCk7XHJcbiAgICAgICAgaWYgKGlzRGF0YVVSTCkge1xyXG4gICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZSgndW5zYWZlOicsICcnKTtcclxuICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VQYXRoICsgJy8nICsgbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiJdfQ==