@vgroup/dialbox 0.0.5 → 0.0.7
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/esm2020/lib/components/call-progress/call-progress.component.mjs +438 -0
- package/esm2020/lib/components/call-progress/incoming-call/incoming-call.component.mjs +191 -0
- package/esm2020/lib/components/caller-id-dialog/caller-id-dialog.component.mjs +56 -0
- package/esm2020/lib/dialbox.component.mjs +3 -3
- package/esm2020/lib/dialbox.module.mjs +18 -3
- package/esm2020/lib/shared/global-constant.mjs +6 -0
- package/esm2020/public-api.mjs +4 -1
- package/fesm2015/vgroup-dialbox.mjs +706 -8
- package/fesm2015/vgroup-dialbox.mjs.map +1 -1
- package/fesm2020/vgroup-dialbox.mjs +689 -8
- package/fesm2020/vgroup-dialbox.mjs.map +1 -1
- package/lib/components/call-progress/call-progress.component.d.ts +80 -0
- package/lib/components/call-progress/incoming-call/incoming-call.component.d.ts +41 -0
- package/lib/components/caller-id-dialog/caller-id-dialog.component.d.ts +25 -0
- package/lib/dialbox.module.d.ts +8 -5
- package/lib/shared/global-constant.d.ts +5 -0
- package/package.json +3 -2
- package/public-api.d.ts +3 -0
|
@@ -944,10 +944,10 @@ export class DialboxComponent {
|
|
|
944
944
|
}
|
|
945
945
|
}
|
|
946
946
|
DialboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DialboxComponent, deps: [{ token: i1.TwilioService }, { token: i2.ExtensionService }, { token: i3.IpAddressService }, { token: i2.ExtensionService }, { token: i4.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
947
|
-
DialboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DialboxComponent, selector: "lib-dialbox", inputs: { isDialpadHidden: "isDialpadHidden" }, outputs: { closeDialpadEvent: "closeDialpadEvent", callInitiated: "callInitiated", endCallEvent: "endCallEvent", minimiseEvent: "minimiseEvent", incomingCallsNewInfoEvent: "incomingCallsNewInfoEvent", incomingCallInitiated: "incomingCallInitiated", numberDialed: "numberDialed" }, viewQueries: [{ propertyName: "dialInputElement", first: true, predicate: ["dialInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\r\n <!-- <app-call-progress *ngIf=\"isCallInProgress\"\r\n (endCallEvent)=\"endCall()\"\r\n (minimiseEvent) = \"onMinimise($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\"\r\n [newIncomingCallData]=\"newIncomingCallData\"\r\n [newIncomingCallsList]=\"incomingCallsList\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\"\r\n [callData]=\"callData\"></app-call-progress> -->\r\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\r\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\r\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\r\n <div class=\"no-selection-alert\">\r\n <!-- <p class=\"mb-0\">Select C2C number to call</p> -->\r\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\r\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"flex-grow-1 my-auto text-left\">\r\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\r\n <!-- <button class=\"btn btn-link btn-success btn-disc p-0 px-2\">Continue</button> -->\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\r\n <div class=\"d-flex justify-content-between mt-2\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>\r\n </span>\r\n </div>\r\n <div class=\"input-box\">\r\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\" (ngModelChange)=\"onDialInputChange($event)\"/>\r\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\r\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\" enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\r\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\" d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \"/>\r\n </svg> \r\n </span>\r\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\" ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i class=\"fa fa-info-circle\"></i></span>\r\n </div>\r\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\r\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\r\n </div>\r\n <!-- <div class=\"input-error\" *ngIf=\"dialAlert.show\">\r\n <span>{{dialAlert.msg}}</span>\r\n </div> -->\r\n <div>\r\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\r\n <div class=\"contact-img\">\r\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\"/>\r\n <ng-template #alphaName>\r\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-details\">\r\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\r\n <p>{{contact.numbersList[0].number}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"wave-container\">\r\n <svg\r\n class=\"waves\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\"\r\n preserveAspectRatio=\"none\"\r\n shape-rendering=\"auto\"\r\n >\r\n <defs>\r\n <path\r\n id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\"\r\n />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"0\"\r\n fill=\"rgba(255,255,255,0.7)\"\r\n />\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"3\"\r\n fill=\"rgba(255,255,255,0.5)\"\r\n />\r\n <!-- <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"5\"\r\n fill=\"rgba(255,255,255,0.3)\"\r\n /> -->\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\r\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\"\r\n (keydown.enter)=\"onEnter(key.num)\" (click)=\"addNumber(key.num)\"\r\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\"\r\n [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\r\n {{key.num}} \r\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\r\n voicemail\r\n </span>\r\n <ng-template #otherThanOne>\r\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text : ' '}}</span>\r\n </ng-template>\r\n </button>\r\n </div>\r\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\" (mouseleave)=\"onCallBtnMouseLeave($event)\">\r\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\r\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\r\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\r\n {{selectedCallerId?.number}}\r\n </div>\r\n </div>\r\n <ng-template #askBlock>\r\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\r\n <div class=\"d-flex justify-content-center\">\r\n <h5 class=\"mb-0\">Select C2C number</h5>\r\n <!-- <span class=\"ml-2\" style=\"opacity:.8;margin-top:2px\">\r\n <img src=\"assets/images/icon_down_arrow.svg\" alt=\"down\" width=\"10px\">\r\n </span> -->\r\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\r\n <span class=\"guidetext\">Please select a number from below dropdown</span>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\r\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\" [ngClass]=\"{'visible': !isCallerIdHidden}\" >\r\n <div style=\"display: flex; justify-content: space-between\">\r\n <!-- <h4>Select C2C Softphone Number</h4> -->\r\n <h4>Make outgoing call using</h4>\r\n <span\r\n class=\"material-symbols-outlined\"\r\n style=\"cursor: pointer\"\r\n (click)=\"isCallerIdHidden = true\"\r\n >\r\n close\r\n </span>\r\n </div>\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <!-- <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"onDedicatedNumSelect(callerId)\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li> -->\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n <ng-template #noCallerIdMessage>\r\n <span class=\"no-caller-id-message\">To make any voice calls, please <a routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\" title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\r\n </span>\r\n </ng-template>\r\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\r\n <div class=\"card dedicatedNumPopup\">\r\n <div class=\"card-header chooseDedicatedHeader\">\r\n <h5>Choose C2C Number</h5>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\r\n </div>\r\n <div class=\"card-body dedicatedNumList\">\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"showDedicatedPopup = false\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"incoming-call-widget\" *ngFor=\"let call of newIncomingCalls;let i = index\" [ngStyle]=\"{'top': (30 + i * 72) + 'px'}\">\r\n <div>\r\n <div class=\"inc-user-img\">\r\n <img src=\"assets/images/user.jpg\" alt=\"user image\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"flex-grow-1\">\r\n <!-- <h6 class=\"mb-1 font-weight-bold\">Incoming Call</h6> -->\r\n <p class=\"inc-user-name\">{{call.customParameters.get('name')}}</p>\r\n <p>{{call.parameters.From}}</p>\r\n \r\n <!-- <p class=\"inc-user-name\">John Doe</p> \r\n <p>+12337472489</p>\r\n <p style=\"font-size: 12px;color:#d5d5d5 !important;margin-top:2px\">Call on +12264584100</p> -->\r\n \r\n </div>\r\n <div class=\"d-flex\">\r\n <button class=\"inc-call-btn inc-accept-btn mr-2\" (click)=\"acceptNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </button>\r\n <!-- <button class=\"inc-call-btn inc-reject-btn\" (click)=\"rejectNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call_end\r\n </span>\r\n </button> -->\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n ", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px;height:600px;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
947
|
+
DialboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DialboxComponent, selector: "lib-dialbox", inputs: { isDialpadHidden: "isDialpadHidden" }, outputs: { closeDialpadEvent: "closeDialpadEvent", callInitiated: "callInitiated", endCallEvent: "endCallEvent", minimiseEvent: "minimiseEvent", incomingCallsNewInfoEvent: "incomingCallsNewInfoEvent", incomingCallInitiated: "incomingCallInitiated", numberDialed: "numberDialed" }, viewQueries: [{ propertyName: "dialInputElement", first: true, predicate: ["dialInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\r\n lib all called\r\n</div>\r\n<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\r\n <!-- <app-call-progress *ngIf=\"isCallInProgress\"\r\n (endCallEvent)=\"endCall()\"\r\n (minimiseEvent) = \"onMinimise($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\"\r\n [newIncomingCallData]=\"newIncomingCallData\"\r\n [newIncomingCallsList]=\"incomingCallsList\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\"\r\n [callData]=\"callData\"></app-call-progress> -->\r\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\r\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\r\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\r\n <div class=\"no-selection-alert\">\r\n <!-- <p class=\"mb-0\">Select C2C number to call</p> -->\r\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\r\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"flex-grow-1 my-auto text-left\">\r\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\r\n <!-- <button class=\"btn btn-link btn-success btn-disc p-0 px-2\">Continue</button> -->\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\r\n <div class=\"d-flex justify-content-between mt-2\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>\r\n </span>\r\n </div>\r\n <div class=\"input-box\">\r\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\" (ngModelChange)=\"onDialInputChange($event)\"/>\r\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\r\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\" enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\r\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\" d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \"/>\r\n </svg> \r\n </span>\r\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\" ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i class=\"fa fa-info-circle\"></i></span>\r\n </div>\r\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\r\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\r\n </div>\r\n <!-- <div class=\"input-error\" *ngIf=\"dialAlert.show\">\r\n <span>{{dialAlert.msg}}</span>\r\n </div> -->\r\n <div>\r\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\r\n <div class=\"contact-img\">\r\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\"/>\r\n <ng-template #alphaName>\r\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-details\">\r\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\r\n <p>{{contact.numbersList[0].number}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"wave-container\">\r\n <svg\r\n class=\"waves\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\"\r\n preserveAspectRatio=\"none\"\r\n shape-rendering=\"auto\"\r\n >\r\n <defs>\r\n <path\r\n id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\"\r\n />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"0\"\r\n fill=\"rgba(255,255,255,0.7)\"\r\n />\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"3\"\r\n fill=\"rgba(255,255,255,0.5)\"\r\n />\r\n <!-- <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"5\"\r\n fill=\"rgba(255,255,255,0.3)\"\r\n /> -->\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\r\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\"\r\n (keydown.enter)=\"onEnter(key.num)\" (click)=\"addNumber(key.num)\"\r\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\"\r\n [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\r\n {{key.num}} \r\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\r\n voicemail\r\n </span>\r\n <ng-template #otherThanOne>\r\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text : ' '}}</span>\r\n </ng-template>\r\n </button>\r\n </div>\r\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\" (mouseleave)=\"onCallBtnMouseLeave($event)\">\r\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\r\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\r\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\r\n {{selectedCallerId?.number}}\r\n </div>\r\n </div>\r\n <ng-template #askBlock>\r\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\r\n <div class=\"d-flex justify-content-center\">\r\n <h5 class=\"mb-0\">Select C2C number</h5>\r\n <!-- <span class=\"ml-2\" style=\"opacity:.8;margin-top:2px\">\r\n <img src=\"assets/images/icon_down_arrow.svg\" alt=\"down\" width=\"10px\">\r\n </span> -->\r\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\r\n <span class=\"guidetext\">Please select a number from below dropdown</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\r\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\" [ngClass]=\"{'visible': !isCallerIdHidden}\" >\r\n <div style=\"display: flex; justify-content: space-between\">\r\n <!-- <h4>Select C2C Softphone Number</h4> -->\r\n <h4>Make outgoing call using</h4>\r\n <span\r\n class=\"material-symbols-outlined\"\r\n style=\"cursor: pointer\"\r\n (click)=\"isCallerIdHidden = true\"\r\n >\r\n close\r\n </span>\r\n </div>\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"onDedicatedNumSelect(callerId)\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n <ng-template #noCallerIdMessage>\r\n <span class=\"no-caller-id-message\">To make any voice calls, please <a routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\" title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\r\n </span>\r\n </ng-template>\r\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\r\n <div class=\"card dedicatedNumPopup\">\r\n <div class=\"card-header chooseDedicatedHeader\">\r\n <h5>Choose C2C Number</h5>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\r\n </div>\r\n <div class=\"card-body dedicatedNumList\">\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"showDedicatedPopup = false\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"incoming-call-widget\" *ngFor=\"let call of newIncomingCalls;let i = index\" [ngStyle]=\"{'top': (30 + i * 72) + 'px'}\">\r\n <div>\r\n <div class=\"inc-user-img\">\r\n <img src=\"assets/images/user.jpg\" alt=\"user image\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"flex-grow-1\">\r\n <!-- <h6 class=\"mb-1 font-weight-bold\">Incoming Call</h6> -->\r\n <p class=\"inc-user-name\">{{call.customParameters.get('name')}}</p>\r\n <p>{{call.parameters.From}}</p>\r\n\r\n <!-- <p class=\"inc-user-name\">John Doe</p> \r\n <p>+12337472489</p>\r\n <p style=\"font-size: 12px;color:#d5d5d5 !important;margin-top:2px\">Call on +12264584100</p> -->\r\n\r\n </div>\r\n <div class=\"d-flex\">\r\n <button class=\"inc-call-btn inc-accept-btn mr-2\" (click)=\"acceptNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </button>\r\n <button class=\"inc-call-btn inc-reject-btn\" (click)=\"rejectNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call_end\r\n </span>\r\n </button>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px;height:600px;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
948
948
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DialboxComponent, decorators: [{
|
|
949
949
|
type: Component,
|
|
950
|
-
args: [{ selector: 'lib-dialbox', template: "<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\r\n <!-- <app-call-progress *ngIf=\"isCallInProgress\"\r\n (endCallEvent)=\"endCall()\"\r\n (minimiseEvent) = \"onMinimise($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\"\r\n [newIncomingCallData]=\"newIncomingCallData\"\r\n [newIncomingCallsList]=\"incomingCallsList\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\"\r\n [callData]=\"callData\"></app-call-progress> -->\r\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\r\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\r\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\r\n <div class=\"no-selection-alert\">\r\n <!-- <p class=\"mb-0\">Select C2C number to call</p> -->\r\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\r\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"flex-grow-1 my-auto text-left\">\r\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\r\n <!-- <button class=\"btn btn-link btn-success btn-disc p-0 px-2\">Continue</button> -->\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\r\n <div class=\"d-flex justify-content-between mt-2\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>\r\n </span>\r\n </div>\r\n <div class=\"input-box\">\r\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\" (ngModelChange)=\"onDialInputChange($event)\"/>\r\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\r\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\" enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\r\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\" d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \"/>\r\n </svg> \r\n </span>\r\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\" ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i class=\"fa fa-info-circle\"></i></span>\r\n </div>\r\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\r\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\r\n </div>\r\n <!-- <div class=\"input-error\" *ngIf=\"dialAlert.show\">\r\n <span>{{dialAlert.msg}}</span>\r\n </div> -->\r\n <div>\r\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\r\n <div class=\"contact-img\">\r\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\"/>\r\n <ng-template #alphaName>\r\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-details\">\r\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\r\n <p>{{contact.numbersList[0].number}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"wave-container\">\r\n <svg\r\n class=\"waves\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\"\r\n preserveAspectRatio=\"none\"\r\n shape-rendering=\"auto\"\r\n >\r\n <defs>\r\n <path\r\n id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\"\r\n />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"0\"\r\n fill=\"rgba(255,255,255,0.7)\"\r\n />\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"3\"\r\n fill=\"rgba(255,255,255,0.5)\"\r\n />\r\n <!-- <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"5\"\r\n fill=\"rgba(255,255,255,0.3)\"\r\n /> -->\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\r\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\"\r\n (keydown.enter)=\"onEnter(key.num)\" (click)=\"addNumber(key.num)\"\r\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\"\r\n [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\r\n {{key.num}} \r\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\r\n voicemail\r\n </span>\r\n <ng-template #otherThanOne>\r\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text : ' '}}</span>\r\n </ng-template>\r\n </button>\r\n </div>\r\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\" (mouseleave)=\"onCallBtnMouseLeave($event)\">\r\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\r\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\r\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\r\n {{selectedCallerId?.number}}\r\n </div>\r\n </div>\r\n <ng-template #askBlock>\r\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\r\n <div class=\"d-flex justify-content-center\">\r\n <h5 class=\"mb-0\">Select C2C number</h5>\r\n <!-- <span class=\"ml-2\" style=\"opacity:.8;margin-top:2px\">\r\n <img src=\"assets/images/icon_down_arrow.svg\" alt=\"down\" width=\"10px\">\r\n </span> -->\r\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\r\n <span class=\"guidetext\">Please select a number from below dropdown</span>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\r\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\" [ngClass]=\"{'visible': !isCallerIdHidden}\" >\r\n <div style=\"display: flex; justify-content: space-between\">\r\n <!-- <h4>Select C2C Softphone Number</h4> -->\r\n <h4>Make outgoing call using</h4>\r\n <span\r\n class=\"material-symbols-outlined\"\r\n style=\"cursor: pointer\"\r\n (click)=\"isCallerIdHidden = true\"\r\n >\r\n close\r\n </span>\r\n </div>\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <!-- <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"onDedicatedNumSelect(callerId)\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li> -->\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n <ng-template #noCallerIdMessage>\r\n <span class=\"no-caller-id-message\">To make any voice calls, please <a routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\" title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\r\n </span>\r\n </ng-template>\r\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\r\n <div class=\"card dedicatedNumPopup\">\r\n <div class=\"card-header chooseDedicatedHeader\">\r\n <h5>Choose C2C Number</h5>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\r\n </div>\r\n <div class=\"card-body dedicatedNumList\">\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"showDedicatedPopup = false\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"incoming-call-widget\" *ngFor=\"let call of newIncomingCalls;let i = index\" [ngStyle]=\"{'top': (30 + i * 72) + 'px'}\">\r\n <div>\r\n <div class=\"inc-user-img\">\r\n <img src=\"assets/images/user.jpg\" alt=\"user image\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"flex-grow-1\">\r\n <!-- <h6 class=\"mb-1 font-weight-bold\">Incoming Call</h6> -->\r\n <p class=\"inc-user-name\">{{call.customParameters.get('name')}}</p>\r\n <p>{{call.parameters.From}}</p>\r\n \r\n <!-- <p class=\"inc-user-name\">John Doe</p> \r\n <p>+12337472489</p>\r\n <p style=\"font-size: 12px;color:#d5d5d5 !important;margin-top:2px\">Call on +12264584100</p> -->\r\n \r\n </div>\r\n <div class=\"d-flex\">\r\n <button class=\"inc-call-btn inc-accept-btn mr-2\" (click)=\"acceptNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </button>\r\n <!-- <button class=\"inc-call-btn inc-reject-btn\" (click)=\"rejectNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call_end\r\n </span>\r\n </button> -->\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n ", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px;height:600px;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}\n"] }]
|
|
950
|
+
args: [{ selector: 'lib-dialbox', template: "<div>\r\n lib all called\r\n</div>\r\n<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\r\n <!-- <app-call-progress *ngIf=\"isCallInProgress\"\r\n (endCallEvent)=\"endCall()\"\r\n (minimiseEvent) = \"onMinimise($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\"\r\n [newIncomingCallData]=\"newIncomingCallData\"\r\n [newIncomingCallsList]=\"incomingCallsList\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\"\r\n [callData]=\"callData\"></app-call-progress> -->\r\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\r\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\r\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\r\n <div class=\"no-selection-alert\">\r\n <!-- <p class=\"mb-0\">Select C2C number to call</p> -->\r\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\r\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"flex-grow-1 my-auto text-left\">\r\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\r\n <!-- <button class=\"btn btn-link btn-success btn-disc p-0 px-2\">Continue</button> -->\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\r\n <div class=\"d-flex justify-content-between mt-2\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>\r\n </span>\r\n </div>\r\n <div class=\"input-box\">\r\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\" (ngModelChange)=\"onDialInputChange($event)\"/>\r\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\r\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\" enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\r\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\" d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \"/>\r\n </svg> \r\n </span>\r\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\" ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i class=\"fa fa-info-circle\"></i></span>\r\n </div>\r\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\r\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\r\n </div>\r\n <!-- <div class=\"input-error\" *ngIf=\"dialAlert.show\">\r\n <span>{{dialAlert.msg}}</span>\r\n </div> -->\r\n <div>\r\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\r\n <div class=\"contact-img\">\r\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\"/>\r\n <ng-template #alphaName>\r\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-details\">\r\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\r\n <p>{{contact.numbersList[0].number}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"wave-container\">\r\n <svg\r\n class=\"waves\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\"\r\n preserveAspectRatio=\"none\"\r\n shape-rendering=\"auto\"\r\n >\r\n <defs>\r\n <path\r\n id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\"\r\n />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"0\"\r\n fill=\"rgba(255,255,255,0.7)\"\r\n />\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"3\"\r\n fill=\"rgba(255,255,255,0.5)\"\r\n />\r\n <!-- <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"5\"\r\n fill=\"rgba(255,255,255,0.3)\"\r\n /> -->\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\r\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\"\r\n (keydown.enter)=\"onEnter(key.num)\" (click)=\"addNumber(key.num)\"\r\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\"\r\n [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\r\n {{key.num}} \r\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\r\n voicemail\r\n </span>\r\n <ng-template #otherThanOne>\r\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text : ' '}}</span>\r\n </ng-template>\r\n </button>\r\n </div>\r\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\" (mouseleave)=\"onCallBtnMouseLeave($event)\">\r\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\r\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\r\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\r\n {{selectedCallerId?.number}}\r\n </div>\r\n </div>\r\n <ng-template #askBlock>\r\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\r\n <div class=\"d-flex justify-content-center\">\r\n <h5 class=\"mb-0\">Select C2C number</h5>\r\n <!-- <span class=\"ml-2\" style=\"opacity:.8;margin-top:2px\">\r\n <img src=\"assets/images/icon_down_arrow.svg\" alt=\"down\" width=\"10px\">\r\n </span> -->\r\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\r\n <span class=\"guidetext\">Please select a number from below dropdown</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\r\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\" [ngClass]=\"{'visible': !isCallerIdHidden}\" >\r\n <div style=\"display: flex; justify-content: space-between\">\r\n <!-- <h4>Select C2C Softphone Number</h4> -->\r\n <h4>Make outgoing call using</h4>\r\n <span\r\n class=\"material-symbols-outlined\"\r\n style=\"cursor: pointer\"\r\n (click)=\"isCallerIdHidden = true\"\r\n >\r\n close\r\n </span>\r\n </div>\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"onDedicatedNumSelect(callerId)\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n <ng-template #noCallerIdMessage>\r\n <span class=\"no-caller-id-message\">To make any voice calls, please <a routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\" title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\r\n </span>\r\n </ng-template>\r\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\r\n <div class=\"card dedicatedNumPopup\">\r\n <div class=\"card-header chooseDedicatedHeader\">\r\n <h5>Choose C2C Number</h5>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\r\n </div>\r\n <div class=\"card-body dedicatedNumList\">\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"showDedicatedPopup = false\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"incoming-call-widget\" *ngFor=\"let call of newIncomingCalls;let i = index\" [ngStyle]=\"{'top': (30 + i * 72) + 'px'}\">\r\n <div>\r\n <div class=\"inc-user-img\">\r\n <img src=\"assets/images/user.jpg\" alt=\"user image\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"flex-grow-1\">\r\n <!-- <h6 class=\"mb-1 font-weight-bold\">Incoming Call</h6> -->\r\n <p class=\"inc-user-name\">{{call.customParameters.get('name')}}</p>\r\n <p>{{call.parameters.From}}</p>\r\n\r\n <!-- <p class=\"inc-user-name\">John Doe</p> \r\n <p>+12337472489</p>\r\n <p style=\"font-size: 12px;color:#d5d5d5 !important;margin-top:2px\">Call on +12264584100</p> -->\r\n\r\n </div>\r\n <div class=\"d-flex\">\r\n <button class=\"inc-call-btn inc-accept-btn mr-2\" (click)=\"acceptNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </button>\r\n <button class=\"inc-call-btn inc-reject-btn\" (click)=\"rejectNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call_end\r\n </span>\r\n </button>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px;height:600px;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}\n"] }]
|
|
951
951
|
}], ctorParameters: function () { return [{ type: i1.TwilioService }, { type: i2.ExtensionService }, { type: i3.IpAddressService }, { type: i2.ExtensionService }, { type: i4.Router }]; }, propDecorators: { isDialpadHidden: [{
|
|
952
952
|
type: Input
|
|
953
953
|
}], closeDialpadEvent: [{
|
|
@@ -968,4 +968,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
968
968
|
}], numberDialed: [{
|
|
969
969
|
type: Output
|
|
970
970
|
}] } });
|
|
971
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU8vSSxzR0FBc0c7QUFDdEcsd0RBQXdEO0FBQ3hELE9BQW1DLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFLMUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQVNwQyxNQUFNLE9BQU8sZ0JBQWdCO0lBNkQzQixZQUNVLGFBQTRCLEVBQzVCLFVBQTRCO0lBQ3BDLDZCQUE2QjtJQUNyQixTQUEyQixFQUMzQixnQkFBa0MsRUFDbEMsTUFBYztRQUxkLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBRTVCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQWxFZixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNoQyxzQkFBaUIsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNqRSxrQkFBYSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzNELGlCQUFZLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFDNUQsa0JBQWEsR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUNuRSw4QkFBeUIsR0FBd0IsSUFB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RUFBRSxDQUFDO2FBQ2xDO1lBRUQsc0JBQXNCO1lBQ3RCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUN6QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDaEI7WUFFRCxnREFBZ0Q7WUFDaEQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNyQixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2pDO1lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBRXJEO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQzs7OEdBbmdDVSxnQkFBZ0I7a0dBQWhCLGdCQUFnQixnZ0JDeEI3Qiw0cWFBNk9FOzRGRHJOVyxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsYUFBYTtzTkFLZCxlQUFlO3NCQUF2QixLQUFLO2dCQUNJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNpQixnQkFBZ0I7c0JBQXZDLFNBQVM7dUJBQUMsV0FBVztnQkFHWixZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG4vLyBpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLy8gaW1wb3J0IHsgVHdpbGlvU2VydmljZSB9IGZyb20gJ3NyYy9hcHAvZXh0ZW5zaW9uL3R3aWxpby5zZXJ2aWNlJztcbi8vIGltcG9ydCBzd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcbmltcG9ydCB7IEV4dGVuc2lvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvZXh0ZW5zaW9uLnNlcnZpY2UnO1xuLy8gaW1wb3J0IHsgQ2FsbGVySWREaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY2FsbGVyLWlkLWRpYWxvZy9jYWxsZXItaWQtZGlhbG9nLmNvbXBvbmVudCc7XG4vLyBpbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHBhcnNlUGhvbmVOdW1iZXJGcm9tU3RyaW5nLCB7IEFzWW91VHlwZSB9IGZyb20gJ2xpYnBob25lbnVtYmVyLWpzJztcbmltcG9ydCB7IElwQWRkcmVzc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvaXAtYWRkcmVzcy5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cblxuaW1wb3J0IHsga2V5cGFkIH0gZnJvbSAnLi4va2V5cGFkJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2FsbCB9IGZyb20gJ0B0d2lsaW8vdm9pY2Utc2RrJztcbmltcG9ydCB7IFR3aWxpb1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvdHdpbGlvLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGlhbGJveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kaWFsYm94LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGlhbGJveC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGlhbGJveENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGlzRGlhbHBhZEhpZGRlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgY2xvc2VEaWFscGFkRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNhbGxJbml0aWF0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBlbmRDYWxsRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG1pbmltaXNlRXZlbnQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGluY29taW5nQ2FsbHNOZXdJbmZvRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsSW5pdGlhdGVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoJ2RpYWxJbnB1dCcpIGRpYWxJbnB1dEVsZW1lbnQhOiBFbGVtZW50UmVmO1xuXG4gIFxuICBAT3V0cHV0KCkgbnVtYmVyRGlhbGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cblxuICBpc0NhbGxJblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XG4gIGtleXBhZFZhbCA9IGtleXBhZDtcbiAgXG4gIHNob3dJbnB1dENsZWFyQnRuOiBib29sZWFuID0gZmFsc2U7XG4gIGRpYWxlZE51bWJlcjogc3RyaW5nID0gJyc7XG4gIGNvbnRhY3RMaXN0OiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJlZENvbnRhY3RMaXN0OiBhbnlbXSA9IFtdO1xuICBjYWxsZXJJZExpc3Q6IGFueVtdID0gW107XG4gIHNlbGVjdGVkQ2FsbGVySWQ6IGFueTtcbiAgaXNDYWxsZXJJZEhpZGRlbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgaXNUcmlhbFBlcmlvZE92ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNQYXltZW50RHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHRlcm1pbmF0ZUNhbGwgPSBmYWxzZTtcbiAgdG9hc3RUaW1lb3V0ID0gNzAwMDtcbiAgY2FsbE51bWJlclRvYXN0ID0ge1xuICAgIHNob3c6IGZhbHNlLFxuICAgIHR5cGU6ICdhbGVydC1zdWNjZXNzJyxcbiAgICBudW1iZXI6ICcnLFxuICAgIGRpc3BsYXlOdW06ICcnXG4gIH1cbiAgY2FsbERhdGE6IGFueSA9IHtcbiAgICBwaG9uZTogJycsXG4gICAgZGlzcGxheU51bTogJycsXG4gICAgZGlhbDogZmFsc2UsXG4gICAgbmFtZTogJycsXG4gICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgIGV4dE51bTonJ1xuICB9O1xuICBsYXN0RGlhbGVkOiB7IG5hbWU/OiBzdHJpbmc7IGltYWdlPzogc3RyaW5nOyBudW1iZXI6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIHNhbml0aXplZE51bTogYW55O1xuICBkaWFsQWxlcnQgPSB7XG4gICAgbXNnOiAnJyxcbiAgICBzaG93OiBmYWxzZVxuICB9XG4gIHRva2VuOiBhbnk7XG5cbiBcbiAgc2hvd0RlZGljYXRlZFBvcHVwOmJvb2xlYW4gPSBmYWxzZTtcbiAgbmV3SW5jb21pbmdDYWxsczogYW55ID0gW107XG4gIGluY29taW5nQ2FsbHNMaXN0OiBhbnkgPSBbXTtcbiAgbmV3SW5jb21pbmdDYWxsRGF0YT86Q2FsbDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIGNhbGxQcmVmZXJlbmNlOmFueTtcbiAgc2hha2VEZWRpY2F0ZWRCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTbWFydERpYWxDYWxsOmJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0d2lsaW9TZXJ2aWNlOiBUd2lsaW9TZXJ2aWNlLFxuICAgIHByaXZhdGUgZXh0U2VydmljZTogRXh0ZW5zaW9uU2VydmljZSxcbiAgICAvLyBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgaXBTZXJ2aWNlOiBJcEFkZHJlc3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXh0ZW5zaW9uU2VydmljZTogRXh0ZW5zaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRyeXtcbiAgICAgIHRoaXMudG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyk7XG4gICAgICAvL3RoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7IFxuICAgICAgdGhpcy5nZXRDb250YWN0TGlzdCgpO1xuICAgICAgXG4gICAgICAvLyB0aGlzLmdldFVzZXJDYWxsU2V0dGluZygpO1xuICAgICAgY29uc3Qgc3ViMSA9IHRoaXMudHdpbGlvU2VydmljZS5kaWFsTnVtYmVyRnJvbU90aGVyTW9kdWxlLnN1YnNjcmliZSgoY29udGFjdDphbnkpID0+IHtcbiAgICAgICAgaWYgKGNvbnRhY3QubnVtYmVyKSB7XG4gICAgICAgICAgdGhpcy5pc1NtYXJ0RGlhbENhbGwgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoY29udGFjdC5pc0RpYWxGcm9tSGlzdG9yeSkge1xuICAgICAgICAgICAgLy9oYW5kbGUgZGlhbGluZyBmcm9tIGhpc3RvcnkgcGFnZVxuICAgICAgICAgICAgaWYoY29udGFjdC5jYWxsZXJJZCA9PSAnc21hcnREaWFsaW5nJyl7XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IHsgbnVtYmVyOiBjb250YWN0LmZyb20gfTtcbiAgICAgICAgICAgICAgdGhpcy5pc1NtYXJ0RGlhbENhbGwgPSB0cnVlO1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBjb250YWN0Lm5hbWU7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gY29udGFjdC5pbWc7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuZnJvbSA9IGNvbnRhY3QuZnJvbTtcbiAgICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgICAgLy8gdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oY29udGFjdCk7XG4gICAgICAgICAgICAvLyB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnB1c2goY29udGFjdClcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhdGVDYWxsKCk7XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAvLyB0aGlzLmdldFVzZXJDYWxsU2V0dGluZygpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIC8vIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGNvbnRhY3QpO1xuICAgICAgICAgICAgLy8gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5wdXNoKGNvbnRhY3QpXG4gICAgICAgICAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250YWN0LmNhbGxlcklkID09ICdhbHdheXNBc2snIHx8IGNvbnRhY3QuY2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpIHtcbiAgICAgICAgICAgICAgLy8gdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gY29udGFjdC5uYW1lO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmltZyA9IGNvbnRhY3QuaW1nO1xuICAgICAgICAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgICB0aGlzLmluaXRpYXRlQ2FsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgfSlcbiAgXG4gICAgICAvLyBoYW5kbGUgaW5jb21pbmcgY2FsbFxuICAgICAgY29uc3Qgc3ViMiA9IHRoaXMudHdpbGlvU2VydmljZS5jdXJyZW50Q2FsbC5zdWJzY3JpYmUoaW5jb21pbmdDYWxsRGF0YSA9PiB7XG4gICAgICAgIC8vIGlmIChpbmNvbWluZ0NhbGxEYXRhKSB7XG4gICAgICAgIC8vICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgLy8gICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAvLyAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBpbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMuRnJvbTtcbiAgICAgICAgLy8gICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCduYW1lJyk7XG4gICAgICAgIC8vICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCdpbWFnZScpO1xuICAgICAgICAvLyAgIHRoaXMuY2FsbERhdGEuaXNJbmNvbWluZ0NhbGwgPSB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIGlmIChpbmNvbWluZ0NhbGxEYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNDYWxsSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzLnB1c2goaW5jb21pbmdDYWxsRGF0YSk7XG4gICAgICAgICAgICAvLyB0aGlzLmdldFVzZXJJbmZvcm1hdGlvbihpbmNvbWluZ0NhbGxEYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gaW5jb21pbmdDYWxsRGF0YS5wYXJhbWV0ZXJzWydGcm9tJ107XG4gICAgICAgICAgICAvLyB0aGlzLmdldFVzZXJJbmZvcm1hdGlvbihpbmNvbWluZ0NhbGxEYXRhKTtcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IGluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycy5nZXQoJ25hbWUnKTtcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzLmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmlzSW5jb21pbmdDYWxsID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5jb21pbmdDYWxsRGF0YS5vbignY2FuY2VsJywgKCkgPT4ge1xuICAgICAgICAgICAgLy8gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IHRoaXMuaW5jb21pbmdDYWxsc0xpc3QuZmlsdGVyKChpdGVtOmFueSkgPT4gaXRlbS5wYXJhbWV0ZXJzLkNhbGxTaWQgIT09IGluY29taW5nQ2FsbERhdGEucGFyYW1ldGVycy5DYWxsU2lkKTtcbiAgICAgICAgICAgIGlmKHRoaXMuaW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGluY29taW5nQ2FsbERhdGEub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbHRlcigoaXRlbTphbnkpID0+IGl0ZW0ucGFyYW1ldGVycy5DYWxsU2lkICE9PSBpbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMuQ2FsbFNpZCk7XG4gICAgICAgICAgICAgIGlmKHRoaXMuaW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHN1YjEpO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWIyKTtcbiAgICB9Y2F0Y2goZSl7XG4gICAgICBjb25zb2xlLmxvZyhlKVxuICAgIH1cbiAgICBcbiAgfVxuXG4gIFxuICAvLyBnZXRVc2VySW5mb3JtYXRpb24oaW5jb21pbmdDYWxsRGF0YTogYW55KSB7XG4gIC8vICAgbGV0IGRhdGEgPSB0aGlzLmZyb21FbnRyaWVzKEFycmF5LmZyb20oaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzLmVudHJpZXMoKSkpO1xuICAvLyAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24oZGF0YS50d2lsaW9BdXRoSWQpLnN1YnNjcmliZShcbiAgLy8gICByZXNwb25zZSA9PiB7XG4gIC8vICAgICBpbmNvbWluZ0NhbGxEYXRhWyd1c2VySW5mbyddPXJlc3BvbnNlXG4gIC8vICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnB1c2goaW5jb21pbmdDYWxsRGF0YSk7XG4gIC8vICAgfSwgZXJyb3IgPT4ge1xuICAvLyAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgZnJvbUVudHJpZXMoZW50cmllczogW3N0cmluZywgYW55XVtdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIGVudHJpZXMucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5yZWdpc3RlckRyYWdFbGVtZW50KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2lzRGlhbHBhZEhpZGRlbiddICYmICF0aGlzLmlzRGlhbHBhZEhpZGRlbikge1xuICAgICAgdGhpcy5nZXRDb250YWN0TGlzdCgpO1xuICAgICAgLy8gdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRpYWxJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcmVnaXN0ZXJEcmFnRWxlbWVudCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZWxtbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhZ3BhcmVudDEnKTtcblxuICAgICAgbGV0IHBvczEgPSAwLCBwb3MyID0gMCwgcG9zMyA9IDAsIHBvczQgPSAwO1xuXG4gICAgICBjb25zdCBkcmFnTW91c2VEb3duID0gKGU6YW55KSA9PiB7XG4gICAgICAgIC8vIElmIHRoZSB0YXJnZXQgaXMgYW4gaW5wdXQsIHJldHVybiBhbmQgZG9uJ3QgaW5pdGlhdGUgZHJhZ2dpbmdcbiAgICAgICAgaWYgKGUudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcbiAgICAgICAgLy8gZ2V0IHRoZSBtb3VzZSBjdXJzb3IgcG9zaXRpb24gYXQgc3RhcnR1cDpcbiAgICAgICAgcG9zMyA9IGUuY2xpZW50WDtcbiAgICAgICAgcG9zNCA9IGUuY2xpZW50WTtcbiAgICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gY2xvc2VEcmFnRWxlbWVudDtcbiAgICAgICAgLy8gY2FsbCBhIGZ1bmN0aW9uIHdoZW5ldmVyIHRoZSBjdXJzb3IgbW92ZXM6XG4gICAgICAgIGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gZWxlbWVudERyYWc7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbGVtZW50RHJhZyA9IChlOmFueSkgPT4ge1xuXG4gICAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBuZXcgY3Vyc29yIHBvc2l0aW9uOlxuICAgICAgICBwb3MxID0gcG9zMyAtIGUuY2xpZW50WDtcbiAgICAgICAgcG9zMiA9IHBvczQgLSBlLmNsaWVudFk7XG4gICAgICAgIHBvczMgPSBlLmNsaWVudFg7XG4gICAgICAgIHBvczQgPSBlLmNsaWVudFk7XG4gICAgICAgIC8vIHNldCB0aGUgZWxlbWVudCdzIG5ldyBwb3NpdGlvbjpcbiAgICAgICAgLy8gZWxtbnQuc3R5bGUudG9wID0gZWxtbnQub2Zmc2V0VG9wIC0gcG9zMiArICdweCc7XG4gICAgICAgIC8vIGVsbW50LnN0eWxlLmxlZnQgPSBlbG1udC5vZmZzZXRMZWZ0IC0gcG9zMSArICdweCc7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjbG9zZURyYWdFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICAvKiBzdG9wIG1vdmluZyB3aGVuIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZDoqL1xuICAgICAgICBkb2N1bWVudC5vbm1vdXNldXAgPSBudWxsO1xuICAgICAgICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IG51bGw7XG4gICAgICB9O1xuXG4gICAgICAvLyBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxtbnQuaWQgKyAnaGVhZGVyJykpIHtcbiAgICAgIC8vICAgLyogaWYgcHJlc2VudCwgdGhlIGhlYWRlciBpcyB3aGVyZSB5b3UgbW92ZSB0aGUgRElWIGZyb206Ki9cbiAgICAgIC8vICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxtbnQuaWQgKyAnaGVhZGVyJykub25tb3VzZWRvd24gPSBkcmFnTW91c2VEb3duO1xuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgLyogb3RoZXJ3aXNlLCBtb3ZlIHRoZSBESVYgZnJvbSBhbnl3aGVyZSBpbnNpZGUgdGhlIERJVjoqL1xuICAgICAgLy8gICBlbG1udC5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XG4gICAgICAvLyB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSlcbiAgICB9XG4gIH1cblxuICBhZGROdW1iZXIobnVtOiBhbnkpIHtcbiAgICBpZiAoIG51bSA9PSAnIycgfHwgbnVtID09ICcqJyB8fG51bSA9PSAnKycgfHwgTnVtYmVyLmlzSW50ZWdlcihudW0pKSB7XG4gICAgICBpZiAobnVtID09ICcjJykge1xuICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtaGFzaC0ubXAzYCkucGxheSgpO1xuICAgICAgfSBlbHNlIGlmIChudW0gPT0gJyonKSB7XG4gICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1zdGFyLS5tcDNgKS5wbGF5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtJHtudW19LS5tcDNgKS5wbGF5KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGlhbGVkTnVtYmVyICs9IG51bTtcbiAgICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSB0cnVlO1xuXG4gICAgICB0aGlzLm51bWJlckRpYWxlZC5lbWl0KHRoaXMuZGlhbGVkTnVtYmVyKTtcblxuICAgICAgdGhpcy5vbkRpYWxJbnB1dENoYW5nZSh0aGlzLmRpYWxlZE51bWJlcilcbiAgICAgIC8vIHRoaXMuZGlhbElucHV0UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9ZWxzZSBpZihudW0gPT09ICd2b2ljZW1haWwnKXtcbiAgICAgIC8vIHRoaXMuc2hvd0RlZGljYXRlZFBvcHVwID0gdHJ1ZTtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnZXh0ZW5zaW9uL3ZvaWNlbWFpbC8nK3RoaXMudG9rZW5dKTtcbiAgICB9XG4gIH1cbiAgXG4gIGhpZGVEaWFscGFkKCkge1xuICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLmNsb3NlRGlhbHBhZEV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLmNsZWFyQWxsRGlhbGVkKCk7XG4gICAgdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0ID0gW107XG4gIH1cbiAgXG4gIG9uRGlhbElucHV0Q2hhbmdlKGlucHV0VmFsOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXBkYXRlZCByZWdleCB0byBpbmNsdWRlIHgsIFgsIGV4dC4sIEV4dC4sIGFuZCAsXG4gICAgICBjb25zdCBpc051bWVyaWNJbnB1dCA9IC9eW1xcZFxccytcXC1dKyQvLnRlc3QoaW5wdXRWYWwpO1xuICAgICAgbGV0IG1haW5OdW1iZXIgPSBpbnB1dFZhbDtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGV4dGVuc2lvbiBpbmRpY2F0b3JzIGFuZCBzcGxpdCB0aGUgaW5wdXRcbiAgICAgIGNvbnN0IGV4dE1hdGNoID0gaW5wdXRWYWwubWF0Y2goLyh4fFh8ZXh0XFwufEV4dFxcLnwsKSguKikvKTtcbiAgICAgIGlmIChleHRNYXRjaCkge1xuICAgICAgICBtYWluTnVtYmVyID0gaW5wdXRWYWwuc3Vic3RyaW5nKDAsIGV4dE1hdGNoLmluZGV4KS50cmltKCk7XG4gICAgICAgIHRoaXMuY2FsbERhdGEuZXh0TnVtID0gZXh0TWF0Y2hbMl0udHJpbSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBpc051bWVyaWNJbnB1dCA/IG1haW5OdW1iZXIucmVwbGFjZSgvW1xcc1xcLV0rL2csICcnKSA6IG1haW5OdW1iZXI7XG5cbiAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBpc051bWVyaWNJbnB1dCA/IHRoaXMuc2FuaXRpemVkTnVtIDogJyc7XG4gICAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gaW5wdXRWYWwubGVuZ3RoID4gMDtcblxuICAgICAgaWYgKGlzTnVtZXJpY0lucHV0KSB7XG4gICAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gbmV3IEFzWW91VHlwZSgpLmlucHV0KHRoaXMuc2FuaXRpemVkTnVtKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCBjdXJyZW50IG51bWJlciB3aGVuZXZlciBpbnB1dCBjaGFuZ2VzXG4gICAgICB0aGlzLm51bWJlckRpYWxlZC5lbWl0KHRoaXMuZGlhbGVkTnVtYmVyKTtcblxuICAgICAgaWYgKGlucHV0VmFsLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0ID0gdGhpcy5jb250YWN0TGlzdC5maWx0ZXIoY29udGFjdCA9PiB7XG4gICAgICAgICAgY29uc3QgZnVsbE5hbWUgPSBgJHtjb250YWN0LmZpcnN0TmFtZX0gJHtjb250YWN0Lm1pZGRsZU5hbWV9ICR7Y29udGFjdC5sYXN0TmFtZX1gLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgLy8gcmV0dXJuIGZ1bGxOYW1lLmluY2x1ZGVzKHRoaXMuc2FuaXRpemVkTnVtLnRvTG93ZXJDYXNlKCkpIHx8IGNvbnRhY3QubnVtYmVyc0xpc3Quc29tZShudW0gPT4gbnVtLm51bWJlci5pbmNsdWRlcyh0aGlzLnNhbml0aXplZE51bSkpO1xuICAgICAgICB9KS5zbGljZSgwLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdCA9IFtdO1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Rmlyc3RMZXR0ZXIobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZSA/IG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgfVxuICBjbGVhcklucHV0KCkge1xuICAgIGlmICh0aGlzLmRpYWxlZE51bWJlci5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRpYWxlZE51bWJlciA9IHRoaXMuZGlhbGVkTnVtYmVyLnNsaWNlKDAsIC0xKTtcbiAgICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSB0aGlzLmRpYWxlZE51bWJlci5sZW5ndGggIT09IDA7XG5cbiAgICAgIHRoaXMub25EaWFsSW5wdXRDaGFuZ2UodGhpcy5kaWFsZWROdW1iZXIpXG4gICAgfVxuICB9XG4gIGNsZWFyQWxsRGlhbGVkKCkge1xuICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gJyc7XG4gICAgdGhpcy5zYW5pdGl6ZWROdW0gPSAnJztcbiAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gZmFsc2U7XG4gIH1cbiAgZ2V0Q2FsbGVySWRMaXN0KCkge1xuICAgIHRoaXMuZXh0U2VydmljZS5kaXNwbGF5SUQodGhpcy50b2tlbiB8fCAnJykuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgLy90aGlzLmNhbGxlcklkTGlzdCA9IHJlcy5jYWxsZXJJZExpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbS50eXBlID09PSBcIkMyQyBTb2Z0cGhvbmUgTnVtYmVyXCIpO1xuICAgICAgdGhpcy5jYWxsZXJJZExpc3QgPSByZXMuY2FsbGVySWRMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnZvaWNlRmVhdHVyZSA9PT0gdHJ1ZSk7XG4gICAgICAvLyB0aGlzLmNhbGxlcklkTGlzdCA9IHJlcy5jYWxsZXJJZExpc3Q7XG4gICAgICBpZiAodGhpcy5jYWxsZXJJZExpc3QubGVuZ3RoID09IDEpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENhbGxlcklkID0gdGhpcy5jYWxsZXJJZExpc3RbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5jYWxsUHJlZmVyZW5jZSA9PT0gJ2Fsd2F5c0FzaycgfHwgdGhpcy5jYWxsUHJlZmVyZW5jZSA9PT0gJ3NtYXJ0RGlhbGluZycpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IHRoaXMuY2FsbGVySWRMaXN0LmZpbmQoaXRlbSA9PiAoaXRlbS5udW1iZXIgPT0gdGhpcy5jYWxsUHJlZmVyZW5jZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZ2V0Q29udGFjdExpc3QoKSB7XG4gICAgdGhpcy50d2lsaW9TZXJ2aWNlLmdldENvbnRhY3RMaXN0KCkuc3Vic2NyaWJlKChyZXNwOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXNwLnJlc3BvbnNlID09ICdTdWNjZXNzJykge1xuICAgICAgICB0aGlzLmNvbnRhY3RMaXN0ID0gcmVzcC5waG9uZUJvb2s7XG4gICAgICB9XG4gICAgfSwgZXJyID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGVycilcbiAgICB9KVxuICB9XG4gIGdldEZ1bGxOYW1lKGNvbnRhY3Q6IGFueSk6IHN0cmluZyB7XG4gICAgbGV0IGZ1bGxOYW1lID0gY29udGFjdC5maXJzdE5hbWUgfHwgJyc7XG4gICAgaWYgKGNvbnRhY3QubWlkZGxlTmFtZSkge1xuICAgICAgZnVsbE5hbWUgKz0gYCAke2NvbnRhY3QubWlkZGxlTmFtZX1gO1xuICAgIH1cbiAgICBpZiAoY29udGFjdC5sYXN0TmFtZSkge1xuICAgICAgZnVsbE5hbWUgKz0gYCAke2NvbnRhY3QubGFzdE5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bGxOYW1lLnRyaW0oKTtcbiAgfVxuXG5cbiAgdG9nZ2xlQ2FsbGVySWREaXYoKSB7XG4gICAgdGhpcy5pc0NhbGxlcklkSGlkZGVuID0gIXRoaXMuaXNDYWxsZXJJZEhpZGRlbjtcbiAgfVxuXG4gIG9uQ29udGFjdFNlbGVjdChjb250YWN0OiBhbnkpIHtcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9IGNvbnRhY3QubnVtYmVyc0xpc3RbMF0ubnVtYmVyO1xuICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IHRoaXMuZ2V0RnVsbE5hbWUoY29udGFjdCk7XG4gICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJztcbiAgICB0aGlzLm9uRGlhbElucHV0Q2hhbmdlKHRoaXMuZGlhbGVkTnVtYmVyKTtcbiAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcbiAgfVxuXG4gIGVuZENhbGwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKCdFbmRpbmcgY2FsbCcpO1xuICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcbiAgICAgIFxuICAgICAgLy8gUmVzZXQgY2FsbCBkYXRhXG4gICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAgICAgICBwaG9uZTogJycsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgICBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcbiAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgICAgICBkaWFsOiBmYWxzZSxcbiAgICAgICAgZGlzcGxheU51bTogJycsXG4gICAgICAgIGV4dE51bTogJydcbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIFJlc2V0IGRpYWxlZCBudW1iZXJcbiAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gJyc7XG4gICAgICB0aGlzLnNhbml0aXplZE51bSA9ICcnO1xuICAgICAgXG4gICAgICAvLyBFbWl0IGVuZCBjYWxsIGV2ZW50XG4gICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XG4gICAgICBjb25zb2xlLmxvZygnQ2FsbCBlbmRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBlbmRDYWxsOicsIGVycm9yKTtcbiAgICAgIC8vIEV2ZW4gaWYgdGhlcmUncyBhbiBlcnJvciwgdHJ5IHRvIHJlc2V0IHRoZSBzdGF0ZVxuICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAgICAgICBwaG9uZTogJycsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgICBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcbiAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgICAgICBkaWFsOiBmYWxzZSxcbiAgICAgICAgZGlzcGxheU51bTogJycsXG4gICAgICAgIGV4dE51bTogJydcbiAgICAgIH07XG4gICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYXN5bmMgaW5pdGlhdGVDYWxsKCkge1xuICAvLyAgIHRyeSB7XG4gIC8vICAgICBjb25zb2xlLmxvZygnSW5pdGlhdGluZyBjYWxsIHdpdGggbnVtYmVyOicsIHRoaXMuZGlhbGVkTnVtYmVyKTtcbiAgICAgIFxuICAvLyAgICAgaWYgKCF0aGlzLmRpYWxlZE51bWJlciAmJiB0aGlzLmxhc3REaWFsZWQpIHtcbiAgLy8gICAgICAgY29uc29sZS5sb2coJ1VzaW5nIGxhc3QgZGlhbGVkIG51bWJlcjonLCB0aGlzLmxhc3REaWFsZWQubnVtYmVyKTtcbiAgLy8gICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSB0aGlzLmxhc3REaWFsZWQubnVtYmVyO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBjb25zdCBpc0ludmFsaWQgPSBhd2FpdCB0aGlzLmlzSW52YWxpZE51bWJlcigpO1xuICAvLyAgICAgaWYgKGlzSW52YWxpZCkge1xuICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIG51bWJlciBmb3JtYXQnKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICB0aGlzLnNhdmVMYXN0RGlhbGVkKCk7XG4gIC8vICAgICB0aGlzLmlzU2F2ZWRDb250YWN0RGlhbGxlZCgpO1xuICAgICAgXG4gIC8vICAgICAvLyBDaGVjayBwYXltZW50IHN0YXR1c1xuICAvLyAgICAgdGhpcy5pc1BheW1lbnREdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGF5bWVudER1ZScpID09PSAndHJ1ZSc7XG4gIC8vICAgICBpZiAodGhpcy5pc1BheW1lbnREdWUpIHtcbiAgLy8gICAgICAgY29uc29sZS53YXJuKCdQYXltZW50IGlzIGR1ZScpO1xuICAvLyAgICAgICBzd2FsKCdXYXJuaW5nJywgJ1BsZWFzZSBub3RlIHRoYXQgeW91ciBwYXltZW50IGlzIGR1ZS4gVG8gY29udGludWUgdXNpbmcgb3VyIHNlcnZpY2VzLCBraW5kbHkgc3Vic2NyaWJlIHRvIGF2b2lkIGludGVycnVwdGlvbnMuJyk7XG4gIC8vICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgLy8gQ2hlY2sgaWYgZGlhbGluZyBvd24gbnVtYmVyXG4gIC8vICAgICBpZiAodGhpcy5zYW5pdGl6ZWROdW0gPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xuICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdBdHRlbXB0ZWQgdG8gZGlhbCBvd24gbnVtYmVyJyk7XG4gIC8vICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW5ub3QgZGlhbCB5b3VyIG93biBudW1iZXInKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICAvLyBDaGVjayBtaWNyb3Bob25lIHBlcm1pc3Npb25zXG4gIC8vICAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gYXdhaXQgdGhpcy5jaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gIC8vICAgICBpZiAoIWhhc1Blcm1pc3Npb24pIHtcbiAgLy8gICAgICAgY29uc29sZS53YXJuKCdNaWNyb3Bob25lIHBlcm1pc3Npb24gbm90IGdyYW50ZWQnKTtcbiAgLy8gICAgICAgYXdhaXQgdGhpcy5hc2tGb3JNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAvLyAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGlmICghdGhpcy5zZWxlY3RlZENhbGxlcklkKSB7XG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGNhbGxlciBJRCBzZWxlY3RlZCcpO1xuICAvLyAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgLy8gICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdQbGVhc2Ugc2VsZWN0IGEgQzJDIG51bWJlciB0byBjYWxsIGZyb20nKTtcbiAgLy8gICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlO1xuICAvLyAgICAgICB9LCAzMDAwKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBjb25zb2xlLmxvZygnR2V0dGluZyBudW1iZXIgd2l0aCBjb3VudHJ5IGNvZGUuLi4nKTtcbiAgLy8gICAgIHRoaXMuY2FsbERhdGEuZGlzcGxheU51bSA9ICcnO1xuICAgICAgXG4gIC8vICAgICB0cnkge1xuICAvLyAgICAgICBhd2FpdCB0aGlzLmdldFRvTnVtYmVyKHRoaXMuc2FuaXRpemVkTnVtKTtcbiAgLy8gICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdldHRpbmcgbnVtYmVyIHdpdGggY291bnRyeSBjb2RlOicsIGVycm9yKTtcbiAgLy8gICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdFcnJvciBwcm9jZXNzaW5nIG51bWJlci4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBpZiAodGhpcy50ZXJtaW5hdGVDYWxsKSB7XG4gIC8vICAgICAgIGNvbnNvbGUubG9nKCdDYWxsIHRlcm1pbmF0ZWQgYnkgdXNlcicpO1xuICAvLyAgICAgICB0aGlzLnRlcm1pbmF0ZUNhbGwgPSBmYWxzZTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICAvLyBQcmVwYXJlIGNhbGwgZGF0YVxuICAvLyAgICAgdGhpcy5jYWxsRGF0YSA9IHtcbiAgLy8gICAgICAgLi4udGhpcy5jYWxsRGF0YSxcbiAgLy8gICAgICAgcGhvbmU6IHRoaXMuc2FuaXRpemVkTnVtLFxuICAvLyAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gIC8vICAgICAgIGRpYWw6IHRydWUsXG4gIC8vICAgICAgIGZyb206IHRoaXMuaXNTbWFydERpYWxDYWxsID8gdGhpcy5jYWxsRGF0YS5mcm9tIDogdGhpcy5zZWxlY3RlZENhbGxlcklkLm51bWJlcixcbiAgLy8gICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgLy8gICAgIH07XG5cbiAgLy8gICAgIGNvbnNvbGUubG9nKCdJbml0aWF0aW5nIGNhbGwgd2l0aCBkYXRhOicsIHRoaXMuY2FsbERhdGEpO1xuICAvLyAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgLy8gICAgIHRoaXMuY2FsbEluaXRpYXRlZC5lbWl0KHsgLi4udGhpcy5jYWxsRGF0YSB9KTtcbiAgICAgIFxuICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgICBcbiAgLy8gICB9IGNhdGNoIChlcnJvcikge1xuICAvLyAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gaW5pdGlhdGVDYWxsOicsIGVycm9yKTtcbiAgLy8gICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnRmFpbGVkIHRvIGluaXRpYXRlIGNhbGwuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gIC8vICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICB9XG4gIC8vICAgICAvL3RoaXMuY2xlYXJBbGxEaWFsZWQoKTtcbiAgLy8gICAvLyB9IGVsc2Uge1xuICAvLyAgIC8vICAgc3dhbCgnRXJyb3InLCAnVHJpYWwgcGVyaW9kIGlzIG92ZXIuIFBsZWFzZSBzZXR1cCBwYXltZW50IG1ldGhvZCB0byBjb250aW51ZSBzZXJ2aWNlcycpXG4gIC8vICAgLy8gfVxuICAvLyB9XG5cblxuICAvLyAgYXN5bmMgaW5pdGlhdGVDYWxsKCkge1xuICAvLyAgIGlmICghdGhpcy5kaWFsZWROdW1iZXIgJiYgdGhpcy5sYXN0RGlhbGVkKSB7XG4gIC8vICAgICB0aGlzLnNhbml0aXplZE51bSA9IHRoaXMubGFzdERpYWxlZC5udW1iZXI7XG4gIC8vICAgfVxuICAvLyAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKCk7XG4gIC8vICAgaWYgKGlzSW52YWxpZCkge1xuICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgIH1cbiAgLy8gICB0aGlzLnNhdmVMYXN0RGlhbGVkKCk7XG4gIC8vICAgdGhpcy5pc1NhdmVkQ29udGFjdERpYWxsZWQoKTtcbiAgLy8gICAvL2xldCBpc0NhbGxlcklkU2V0ID0gYXdhaXQgdGhpcy5pc0NhbGxlcklkU2V0KCk7XG4gIC8vICAgdGhpcy5pc1BheW1lbnREdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGF5bWVudER1ZScpID09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gIC8vICAgaWYgKHRoaXMuaXNQYXltZW50RHVlKSB7XG4gIC8vICAgICBzd2FsKCdXYXJuaW5nJywgJ1BsZWFzZSBub3RlIHRoYXQgeW91ciBwYXltZW50IGlzIGR1ZSwgVG8gY29udGludWUgb24geW91ciBzZXJ2aWNlcyBraW5kbHkgc3Vic2NyaWJlIHRvIHVzZSB1bmludGVycnVwdGVkIHNlcnZpY2VzLicpO1xuICAvLyAgICAgcmV0dXJuO1xuICAvLyAgIH1cbiAgLy8gICB0aGlzLmlzVHJpYWxQZXJpb2RPdmVyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RyaWFsT3ZlcicpID09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gIC8vICAgLy8gaWYgKCF0aGlzLmlzVHJpYWxQZXJpb2RPdmVyKSB7XG4gIC8vICAgICBpZiAodGhpcy5zYW5pdGl6ZWROdW0gPT0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aWxpb051bWJlcicpKSB7XG4gIC8vICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW4gbm90IGRpYWwgdGhpcyBudW1iZXInKTtcbiAgLy8gICAgICAgcmV0dXJuO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gYXdhaXQgdGhpcy5jaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gIC8vICAgICBpZiAoaGFzUGVybWlzc2lvbikge1xuICAvLyAgICAgICBpZiAodGhpcy5zZWxlY3RlZENhbGxlcklkKSB7XG4gIC8vICAgICAgICAgLy9jbGVhciBkaXNwbGF5TnVtIGlmIHZhbHVlIGlzIGJpbmRlZCBmcm9tIHByZXZpb3VzIGNhbGxcbiAgLy8gICAgICAgICB0aGlzLmNhbGxEYXRhLmRpc3BsYXlOdW0gPSAnJztcbiAgLy8gICAgICAgICAvLyBnZXQgbnVtYmVyIHRvIGJlIGRpYWxsZWQgZnJvbSBiYWNrZW5kXG4gIC8vICAgICAgICAgYXdhaXQgdGhpcy5nZXRUb051bWJlcih0aGlzLnNhbml0aXplZE51bSk7XG4gIC8vICAgICAgICAgaWYgKHRoaXMudGVybWluYXRlQ2FsbCkge1xuICAvLyAgICAgICAgICAgdGhpcy50ZXJtaW5hdGVDYWxsID0gZmFsc2U7XG4gIC8vICAgICAgICAgICByZXR1cm47XG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSB0aGlzLnNhbml0aXplZE51bTtcbiAgLy8gICAgICAgICB0aGlzLmNhbGxEYXRhLmlzSW5jb21pbmdDYWxsID0gZmFsc2U7XG4gIC8vICAgICAgICAgdGhpcy5jYWxsRGF0YS5kaWFsID0gdHJ1ZTtcbiAgLy8gICAgICAgICBpZiAoIXRoaXMuaXNTbWFydERpYWxDYWxsKSB7XG4gIC8vICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmZyb20gPSB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyO1xuICAvLyAgICAgICAgIH1cbiAgICAgICAgICBcbiAgLy8gICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAvLyAgICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEgPSB7XG4gIC8vICAgICAgICAgICAgICAgLi4udGhpcy5jYWxsRGF0YSxcbiAgLy8gICAgICAgICAgICAgICBwaG9uZTogdGhpcy5zYW5pdGl6ZWROdW0sXG4gIC8vICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAvLyAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXG4gIC8vICAgICAgICAgICAgICAgZnJvbTogdGhpcy5pc1NtYXJ0RGlhbENhbGwgPyB0aGlzLmNhbGxEYXRhLmZyb20gOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxuICAvLyAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gIC8vICAgICAgICAgICAgIH07XG5cbiAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coJ0luaXRpYXRpbmcgY2FsbCB3aXRoIGRhdGE6JywgdGhpcy5jYWxsRGF0YSk7XG4gIC8vICAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gIC8vICAgICAgICAgICAgIHRoaXMuY2FsbEluaXRpYXRlZC5lbWl0KHsgLi4udGhpcy5jYWxsRGF0YSB9KTtcbiAgLy8gICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgLy8gICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgLy8gICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ1NlbGVjdCBhIEMyQyBudW1iZXIgdG8gY2FsbCcpO1xuICAvLyAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAvLyAgICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlO1xuICAvLyAgICAgICAgIH0sIDMwMDApO1xuICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgICAvL3RoaXMuY2FsbGluZ09wZW5FdmVudC5lbWl0KHsgcGhvbmU6IHRoaXMuZGlhbGVkTnVtYmVyIH0pO1xuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgYXdhaXQgdGhpcy5hc2tGb3JNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAvLyAgICAgfVxuICAvLyAgICAgLy90aGlzLmNsZWFyQWxsRGlhbGVkKCk7XG4gIC8vICAgLy8gfSBlbHNlIHtcbiAgLy8gICAvLyAgIHN3YWwoJ0Vycm9yJywgJ1RyaWFsIHBlcmlvZCBpcyBvdmVyLiBQbGVhc2Ugc2V0dXAgcGF5bWVudCBtZXRob2QgdG8gY29udGludWUgc2VydmljZXMnKVxuICAvLyAgIC8vIH1cbiAgLy8gfVxuXG5cbiAgLy8gYXN5bmMgaW5pdGlhdGVDYWxsKCkge1xuICAvLyAgIHRyeXtcbiAgLy8gICAgIGlmICghdGhpcy5kaWFsZWROdW1iZXIgJiYgdGhpcy5sYXN0RGlhbGVkKSB7XG4gIC8vICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gdGhpcy5sYXN0RGlhbGVkLm51bWJlcjtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgY29uc3QgaXNJbnZhbGlkID0gYXdhaXQgdGhpcy5pc0ludmFsaWROdW1iZXIoKTtcbiAgLy8gICAgIGlmIChpc0ludmFsaWQpIHtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuICAvLyAgICAgdGhpcy5zYXZlTGFzdERpYWxlZCgpO1xuICAvLyAgICAgdGhpcy5pc1NhdmVkQ29udGFjdERpYWxsZWQoKTtcbiAgLy8gICAgIC8vbGV0IGlzQ2FsbGVySWRTZXQgPSBhd2FpdCB0aGlzLmlzQ2FsbGVySWRTZXQoKTtcblxuICAvLyAgICAgdGhpcy5pc1BheW1lbnREdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGF5bWVudER1ZScpID09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gIC8vICAgICBpZiAodGhpcy5pc1BheW1lbnREdWUpIHtcbiAgLy8gICAgICAgc3dhbCgnV2FybmluZycsICdQbGVhc2Ugbm90ZSB0aGF0IHlvdXIgcGF5bWVudCBpcyBkdWUsIFRvIGNvbnRpbnVlIG9uIHlvdXIgc2VydmljZXMga2luZGx5IHN1YnNjcmliZSB0byB1c2UgdW5pbnRlcnJ1cHRlZCBzZXJ2aWNlcy4nKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICB0aGlzLmlzVHJpYWxQZXJpb2RPdmVyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RyaWFsT3ZlcicpID09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gIC8vICAgICAvLyBpZiAoIXRoaXMuaXNUcmlhbFBlcmlvZE92ZXIpIHtcbiAgLy8gICAgICAgaWYgKHRoaXMuc2FuaXRpemVkTnVtID09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xuICAvLyAgICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW4gbm90IGRpYWwgdGhpcyBudW1iZXInKTtcbiAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICAgIH1cblxuICAvLyAgICAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gYXdhaXQgdGhpcy5jaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gIC8vICAgICAgIGlmIChoYXNQZXJtaXNzaW9uKSB7XG4gIC8vICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCkge1xuICAvLyAgICAgICAgICAgLy9jbGVhciBkaXNwbGF5TnVtIGlmIHZhbHVlIGlzIGJpbmRlZCBmcm9tIHByZXZpb3VzIGNhbGxcbiAgLy8gICAgICAgICAgIHRoaXMuY2FsbERhdGEuZGlzcGxheU51bSA9ICcnO1xuICAvLyAgICAgICAgICAgLy8gZ2V0IG51bWJlciB0byBiZSBkaWFsbGVkIGZyb20gYmFja2VuZFxuICAvLyAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUb051bWJlcih0aGlzLnNhbml0aXplZE51bSk7XG4gIC8vICAgICAgICAgICBpZiAodGhpcy50ZXJtaW5hdGVDYWxsKSB7XG4gIC8vICAgICAgICAgICAgIHRoaXMudGVybWluYXRlQ2FsbCA9IGZhbHNlO1xuICAvLyAgICAgICAgICAgICByZXR1cm47XG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gdGhpcy5zYW5pdGl6ZWROdW07XG4gIC8vICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmlzSW5jb21pbmdDYWxsID0gZmFsc2U7XG4gIC8vICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmRpYWwgPSB0cnVlO1xuICAvLyAgICAgICAgICAgaWYgKCF0aGlzLmlzU21hcnREaWFsQ2FsbCkge1xuICAvLyAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmZyb20gPSB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyO1xuICAvLyAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gIC8vICAgICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAvLyAgICAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcbiAgLy8gICAgICAgICAgICAgICAgIC4uLnRoaXMuY2FsbERhdGEsXG4gIC8vICAgICAgICAgICAgICAgICBwaG9uZTogdGhpcy5zYW5pdGl6ZWROdW0sXG4gIC8vICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gIC8vICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxuICAvLyAgICAgICAgICAgICAgICAgZnJvbTogdGhpcy5pc1NtYXJ0RGlhbENhbGwgPyB0aGlzLmNhbGxEYXRhLmZyb20gOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxuICAvLyAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgLy8gICAgICAgICAgICAgICB9O1xuXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0luaXRpYXRpbmcgY2FsbCB3aXRoIGRhdGE6JywgdGhpcy5jYWxsRGF0YSk7XG4gIC8vICAgICAgICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmNhbGxJbml0aWF0ZWQuZW1pdCh7IC4uLnRoaXMuY2FsbERhdGEgfSk7XG4gIC8vICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgLy8gICAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IHRydWU7XG4gIC8vICAgICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ1NlbGVjdCBhIEMyQyBudW1iZXIgdG8gY2FsbCcpO1xuICAvLyAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gIC8vICAgICAgICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSBmYWxzZTtcbiAgLy8gICAgICAgICAgIH0sIDMwMDApO1xuICAvLyAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgICAvL3RoaXMuY2FsbGluZ09wZW5FdmVudC5lbWl0KHsgcGhvbmU6IHRoaXMuZGlhbGVkTnVtYmVyIH0pO1xuICAvLyAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgIGF3YWl0IHRoaXMuYXNrRm9yTWljcm9waG9uZVBlcm1pc3Npb24oKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgICAvL3RoaXMuY2xlYXJBbGxEaWFsZWQoKTtcbiAgLy8gICAgIC8vIH0gZWxzZSB7XG4gIC8vICAgICAvLyAgIHN3YWwoJ0Vycm9yJywgJ1RyaWFsIHBlcmlvZCBpcyBvdmVyLiBQbGVhc2Ugc2V0dXAgcGF5bWVudCBtZXRob2QgdG8gY29udGludWUgc2VydmljZXMnKVxuICAvLyAgICAgLy8gfVxuICAvLyAgIH1jYXRjaChlKXtcbiAgLy8gICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGluaXRpYXRlQ2FsbDonLCBlKTtcblxuICAvLyAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdGYWlsZWQgdG8gaW5pdGlhdGUgY2FsbC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcblxuICAvLyAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICB9XG4gIC8vIH1cblxuXG4gIGFzeW5jIGluaXRpYXRlQ2FsbCgpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmRpYWxlZE51bWJlciAmJiB0aGlzLmxhc3REaWFsZWQpIHtcbiAgICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSB0aGlzLmxhc3REaWFsZWQubnVtYmVyO1xuICAgICAgfVxuICBcbiAgICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKCk7XG4gICAgICBpZiAoaXNJbnZhbGlkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMuc2F2ZUxhc3REaWFsZWQoKTtcbiAgICAgIHRoaXMuaXNTYXZlZENvbnRhY3REaWFsbGVkKCk7XG4gIFxuICAgICAgdGhpcy5pc1BheW1lbnREdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGF5bWVudER1ZScpID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAgICAgaWYgKHRoaXMuaXNQYXltZW50RHVlKSB7XG4gICAgICAgIC8vIHN3YWwoJ1dhcm5pbmcnLCAnUGxlYXNlIG5vdGUgdGhhdCB5b3VyIHBheW1lbnQgaXMgZHVlLCBUbyBjb250aW51ZSBvbiB5b3VyIHNlcnZpY2VzIGtpbmRseSBzdWJzY3JpYmUgdG8gdXNlIHVuaW50ZXJydXB0ZWQgc2VydmljZXMuJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgXG4gICAgICB0aGlzLmlzVHJpYWxQZXJpb2RPdmVyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RyaWFsT3ZlcicpID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5zYW5pdGl6ZWROdW0gPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xuICAgICAgICAvLyBzd2FsKCdFcnJvcicsICdZb3UgY2FuIG5vdCBkaWFsIHRoaXMgbnVtYmVyJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgXG4gICAgICAvLyBjb25zdCBoYXNQZXJtaXNzaW9uID0gYXdhaXQgdGhpcy5jaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gICAgICAvLyBpZiAoIWhhc1Blcm1pc3Npb24pIHtcbiAgICAgIC8vICAgYXdhaXQgdGhpcy5hc2tGb3JNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAgICAgLy8gICByZXR1cm4gZmFsc2U7XG4gICAgICAvLyB9XG4gIFxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2FsbGVySWQpIHtcbiAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnU2VsZWN0IGEgQzJDIG51bWJlciB0byBjYWxsJyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSBmYWxzZTtcbiAgICAgICAgfSwgMzAwMCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgXG4gICAgICAvLyBDbGVhciBkaXNwbGF5TnVtIGlmIHZhbHVlIGlzIGJvdW5kIGZyb20gcHJldmlvdXMgY2FsbFxuICAgICAgdGhpcy5jYWxsRGF0YS5kaXNwbGF5TnVtID0gJyc7XG4gICAgICBcbiAgICAgIC8vIEdldCBudW1iZXIgdG8gYmUgZGlhbGVkIGZyb20gYmFja2VuZFxuICAgICAgLy8gYXdhaXQgdGhpcy5nZXRUb051bWJlcih0aGlzLnNhbml0aXplZE51bSk7XG4gICAgICBpZiAodGhpcy50ZXJtaW5hdGVDYWxsKSB7XG4gICAgICAgIHRoaXMudGVybWluYXRlQ2FsbCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIFxuICAgICAgLy8gVXBkYXRlIGNhbGwgZGF0YSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cbiAgICAgIHRoaXMuY2FsbERhdGEgPSB7XG4gICAgICAgIC4uLnRoaXMuY2FsbERhdGEsXG4gICAgICAgIHBob25lOiB0aGlzLnNhbml0aXplZE51bSxcbiAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgICAgICBkaWFsOiB0cnVlLFxuICAgICAgICBmcm9tOiB0aGlzLmlzU21hcnREaWFsQ2FsbCA/IHRoaXMuY2FsbERhdGEuZnJvbSA6IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZC5udW1iZXIsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICB9O1xuICBcbiAgICAgIGNvbnNvbGUubG9nKCdJbml0aWF0aW5nIGNhbGwgd2l0aCBkYXRhOicsIHRoaXMuY2FsbERhdGEpO1xuICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2FsbEluaXRpYXRlZC5lbWl0KHsgLi4udGhpcy5jYWxsRGF0YSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICBcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBpbml0aWF0ZUNhbGw6JywgZSk7XG4gICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ZhaWxlZCB0byBpbml0aWF0ZSBjYWxsLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXNJbnZhbGlkTnVtYmVyKCkge1xuICAgIHRyeSB7XG4gICAgICBpZih0aGlzLnNhbml0aXplZE51bSA9PSAnJyl7XG4gICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWxpZE51bWJlclBhdHRlcm4gPSAvXlsrXFxkXFxzKCktXSokLzsgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIHZhbGlkIGNoYXJhY3RlcnNcbiAgICAgIGNvbnN0IHBob25lTnVtYmVyID0gdGhpcy5zYW5pdGl6ZWROdW07XG4gICAgICBpZiAoIXZhbGlkTnVtYmVyUGF0dGVybi50ZXN0KHBob25lTnVtYmVyKSkge1xuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gUmV0dXJuIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIG1lYW5pbmcgdGhlIG51bWJlciBpcyBpbnZhbGlkXG4gICAgfVxuICB9XG4gIFxuICAvLyBzYXZlTGFzdERpYWxlZCgpIHtcbiAgLy8gICBjb25zdCBjb250YWN0ID0gdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0LmZpbmQoYyA9PiBjLm51bWJlcnNMaXN0LnNvbWUobiA9PiBuLm51bWJlciA9PT0gdGhpcy5kaWFsZWROdW1iZXIpKTtcbiAgLy8gICBpZiAoY29udGFjdCkge1xuICAvLyAgICAgdGhpcy5sYXN0RGlhbGVkID0ge1xuICAvLyAgICAgICBuYW1lOiBjb250YWN0Lm5hbWUsXG4gIC8vICAgICAgIGltYWdlOiBjb250YWN0LmltYWdlLFxuICAvLyAgICAgICBudW1iZXI6IHRoaXMuZGlhbGVkTnVtYmVyXG4gIC8vICAgICB9O1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICBpZih0aGlzLmRpYWxlZE51bWJlcil7XG4gIC8vICAgICAgIHRoaXMubGFzdERpYWxlZCA9IHsgbnVtYmVyOiB0aGlzLmRpYWxlZE51bWJlciB9O1xuICAvLyAgICAgfVxuICAgICAgXG4gIC8vICAgfVxuICAvLyB9XG4gIGlzU2F2ZWRDb250YWN0RGlhbGxlZCgpe1xuICAgIGxldCBwaG9uZU51bSA9IHRoaXMuc2FuaXRpemVkTnVtLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIGxldCBjb250YWN0ID0gIHRoaXMuY29udGFjdExpc3QuZmlsdGVyKGNvbnRhY3QgPT4ge1xuICAgICAgLy8gcmV0dXJuIGNvbnRhY3QubnVtYmVyc0xpc3Quc29tZShudW0gPT4gbnVtLm51bWJlciA9PT0gcGhvbmVOdW0pXG4gICAgfSk7XG4gICAgaWYoY29udGFjdC5sZW5ndGgpe1xuICAgICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gYCR7Y29udGFjdFswXS5maXJzdE5hbWV9ICR7Y29udGFjdFswXS5taWRkbGVOYW1lfSAke2NvbnRhY3RbMF0ubGFzdE5hbWV9YC50b0xvd2VyQ2FzZSgpO1xuICAgICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0WzBdLmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJztcbiAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSB0aGlzLnNhbml0aXplZE51bTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzaG93RGlhbEFsZXJ0KG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHRoaXMuZGlhbEFsZXJ0ID0ge1xuICAgICAgbXNnOiBtZXNzYWdlLFxuICAgICAgc2hvdzogdHJ1ZVxuICAgIH07XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRpYWxBbGVydC5zaG93ID0gZmFsc2U7XG4gICAgfSwgMzAwMCk7XG4gIH1cbiAgYXN5bmMgaXNDYWxsZXJJZFNldCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGtuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpO1xuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLmV4dFNlcnZpY2UuZmV0Y2hDYWxsZXJJZCh0a24gfHwgJycpLnRvUHJvbWlzZSgpO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0cmlhbE92ZXInLCByZXMudHJpYWxPdmVyKTtcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzVHJpYWxPdmVyLm5leHQocmVzLnRyaWFsT3Zlcik7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwYXltZW50RHVlJywgcmVzLnBheW1lbnREdWUpO1xuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNQYXltZW50RHVlLm5leHQocmVzLnBheW1lbnREdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlcy5jYWxsZXJpZCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FsbGVySUQnLCByZXMuY2FsbGVyaWQpO1xuXG4gICAgICAgIHRoaXMuZXh0U2VydmljZS5jaGFuZ2VNZXNzYWdlKHJlcy5jYWxsZXJpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FsbGVySUQnLCAnTm90IHNldCcpO1xuICAgICAgICB0aGlzLmV4dFNlcnZpY2UuY2hhbmdlTWVzc2FnZSgnTm90IHNldCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYWxsZXJJRCcpICE9PSAnTm90IHNldCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBhc3luYyBjaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2godHJhY2sgPT4gdHJhY2suc3RvcCgpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgZXJyb3IubmFtZSA9PT0gJ05vdEFsbG93ZWRFcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBhc3luYyBhc2tGb3JNaWNyb3Bob25lUGVybWlzc2lvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyBhdWRpbzogdHJ1ZSB9KTtcbiAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKHRyYWNrID0+IHRyYWNrLnN0b3AoKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1VzZXIgZGVuaWVkIG1pY3JvcGhvbmUgcGVybWlzc2lvbjonLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIC8vIGJlbG93IGZ1bmN0aW9uIGlzIHRvIGdldCB0aGUgY291bnRyeSBjb2RlIHdpdGggbnVtYmVyIGZyb20gc2VydmVyIFxuICBhc3luYyBnZXRUb051bWJlcihkaWFsZWROdW1iZXI6IHN0cmluZykge1xuICAgIFxuICAgICAgaWYgKGRpYWxlZE51bWJlclswXSAhPT0gJysnKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgY2FzZSB3aGVuIHVzZXIgZ2VvbG9jYXRpb24gZGlhbCBjb2RlIGlzIG9uXG4gICAgICAgIGxldCBpcEFkZHJlc3M6IGFueSA9IGF3YWl0IHRoaXMuaXBTZXJ2aWNlLmdldElwQWRkcmVzc0luZm8oKS50b1Byb21pc2UoKTtcbiAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLnR3aWxpb1NlcnZpY2UuZ2V0VG9OdW1iZXIoZGlhbGVkTnVtYmVyLGlwQWRkcmVzcy5hZGRyZXNzLmNvdW50cnlDb2RlKS50b1Byb21pc2UoKTtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgICAgdGhpcy50b2FzdFRpbWVvdXQgPSByZXMudGltZUludGVydmFsICogMTAwMDtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNob3dOdW1iZXJUb2FzdChyZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gIH1cbiAgaXNBbGVydEVuYWJsZSgpIHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2lzQWxlcnRFbmFibGUnKTtcbiAgfVxuICBhc3luYyBzaG93TnVtYmVyVG9hc3QoZGF0YTogYW55KSB7XG4gICAgY29uc3QgaXNBbGVydE9uID0gKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdpc0NvdW50cnlDb2RlVG9hc3RPbicpKTtcbiAgICBpZiAoaXNBbGVydE9uID09ICd0cnVlJykge1xuICAgICAgdGhpcy5jYWxsTnVtYmVyVG9hc3Quc2hvdyA9IHRydWU7XG4gICAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5udW1iZXIgPSBkYXRhLnRvTnVtYmVyO1xuICAgICAgdGhpcy5jYWxsTnVtYmVyVG9hc3QuZGlzcGxheU51bSA9IGRhdGEuZGlzcGxheU51bWJlcjtcbiAgICB9XG4gICAgXG4gICAgXG4gICAgdGhpcy5jYWxsRGF0YS5kaXNwbGF5TnVtID0gZGF0YS5kaXNwbGF5TnVtYmVyO1xuICAgIC8vdGhpcy5jYWxsRGF0YS5waG9uZSA9IGRhdGEudG9OdW1iZXI7XG4gICAgYXdhaXQgdGhpcy5kZWxheSh0aGlzLnRvYXN0VGltZW91dCk7XG4gICAgdGhpcy5kaWFsZWROdW1iZXIgPSBkYXRhLnRvTnVtYmVyO1xuICAgIHRoaXMuc2FuaXRpemVkTnVtID0gZGF0YS50b051bWJlcjtcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gZmFsc2U7XG4gICAgdGhpcy5jYWxsTnVtYmVyVG9hc3QubnVtYmVyID0gJyc7XG4gICAgdGhpcy5jYWxsTnVtYmVyVG9hc3QuZGlzcGxheU51bSA9ICcnO1xuICB9XG4gIGRlbGF5KG1zOiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gIH1cbiAgaXNNaW5pbWlzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgb25NaW5pbWlzZShpc01pbmltaXNlZDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNNaW5pbWlzZWQgPSBpc01pbmltaXNlZDtcbiAgICB0aGlzLm1pbmltaXNlRXZlbnQuZW1pdChpc01pbmltaXNlZCk7XG4gIH1cbiAgaGFuZGxlTnVtYmVyUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YSB8fCAod2luZG93IGFzIGFueSkuY2xpcGJvYXJkRGF0YTtcbiAgICBjb25zdCBwYXN0ZWREYXRhID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XG5cbiAgICAvLyBMb2cgdGhlIHBhc3RlZCBjb250ZW50IHRvIHRoZSBjb25zb2xlXG4gICAgaWYocGFzdGVkRGF0YSl7XG4gICAgICB0aGlzLmRpYWxlZE51bWJlciA9IHBhc3RlZERhdGE7XG4gICAgICB0aGlzLnNhbml0aXplZE51bSA9IHBhc3RlZERhdGE7XG4gICAgfVxuICAgIFxuICB9XG4gIG9uRW50ZXIobnVtOnN0cmluZykge1xuICAgIGNvbnNvbGUubG9nKG51bSwgJ251bWJlciBmbicpXG4gICAgdGhpcy5kaWFsZWROdW1iZXIgPSB0aGlzLmRpYWxlZE51bWJlciArbnVtO1xuICAgIHRoaXMuc2FuaXRpemVkTnVtID0gdGhpcy5kaWFsZWROdW1iZXI7XG4gICAgdGhpcy5zaG93SW5wdXRDbGVhckJ0biA9IHRydWU7XG4gICAgdGhpcy5udW1iZXJEaWFsZWQuZW1pdCh0aGlzLmRpYWxlZE51bWJlcik7XG4gIH1cbiAgXG4gIGdldFVzZXJDYWxsU2V0dGluZygpIHtcbiAgICBjb25zdCB0a24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyk7XG4gICAgdGhpcy5leHRTZXJ2aWNlLmZldGNoQ2FsbGVySWQodGtuIHx8ICcnKS5zdWJzY3JpYmUoKHJlc3A6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3Auc3RhdHVzID09IDIwMCkge1xuICAgICAgICAvL3RoaXMuY2FsbFByZWZlcm5jZSA9IHJlc3AudXNlclNldHRpbmc7XG4gICAgICAgIHRoaXMuY2FsbFByZWZlcmVuY2UgPSByZXNwLmNhbGxlcmlkO1xuICAgICAgICB0aGlzLmdldENhbGxlcklkTGlzdCgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgb25EZWRpY2F0ZWROdW1TZWxlY3QoaWQ6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IGlkO1xuICAgIHRoaXMuaXNDYWxsZXJJZEhpZGRlbiA9IHRydWU7XG4gICAgdGhpcy5leHRTZXJ2aWNlLnNldENhbGxlcklkKGlkKTtcbiAgfVxuICBjYW5jZWxEaWFsTnVtYmVyKCkge1xuICAgIHRoaXMudGVybWluYXRlQ2FsbCA9IHRydWU7XG4gICAgdGhpcy5jYWxsTnVtYmVyVG9hc3Quc2hvdyA9IGZhbHNlO1xuICB9XG5cbiAgaGFuZGxlRGl2S2V5ZG93bihldjphbnkpe1xuICAgIGlmKHRoaXMuZGlhbGVkTnVtYmVyLmxlbmd0aCA9PSAwKXtcbiAgICAgIHRoaXMuZGlhbElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIGlmIChldi5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBkaWFscGFkIGlzIG9wZW5cbiAgICAgIGlmICghdGhpcy5pc0RpYWxwYWRIaWRkZW4pIHtcbiAgICAgICAgaWYodGhpcy5kaWFsZWROdW1iZXIubGVuZ3RoID4gMiAmJiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQpe1xuICAgICAgICAgIHRoaXMuaW5pdGlhdGVDYWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoIXRoaXMuc2VsZWN0ZWRDYWxsZXJJZCl7XG4gICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IHRydWU7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2U7XG4gICAgICAgICAgfSwgMTAwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG9uQ2FsbEJ0bk1vdXNlRW50ZXIoZXY6IGFueSkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENhbGxlcklkIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ2Fsd2F5c0FzaycpIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpKSB7XG4gICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuICBvbkNhbGxCdG5Nb3VzZUxlYXZlKGV2OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDYWxsZXJJZCB8fCAodGhpcy5zZWxlY3RlZENhbGxlcklkID09ICdhbHdheXNBc2snKSB8fCAodGhpcy5zZWxlY3RlZENhbGxlcklkID09ICdzbWFydERpYWxpbmcnKSkge1xuICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBhY2NlcHROZXdJbmNvbWluZ0NhbGwoY2FsbDogQ2FsbCkge1xuICAgIC8vZmlyc3QgY3V0IHRoZSBjdXJyZW50IGNhbGxcbiAgICAvL3RoaXMuY2FsbERhdGEgPSBjYWxsO1xuICAgIHRoaXMubmV3SW5jb21pbmdDYWxsRGF0YSA9IGNhbGw7XG4gIH1cbiAgcmVqZWN0TmV3SW5jb21pbmdDYWxsKGNhbGw6IENhbGwpIHtcbiAgICBjYWxsLnJlamVjdCgpO1xuICAgIHRoaXMubmV3SW5jb21pbmdDYWxscyA9IHRoaXMubmV3SW5jb21pbmdDYWxscy5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5wYXJhbWV0ZXJzWydDYWxsU2lkJ10gIT09IGNhbGwucGFyYW1ldGVyc1snQ2FsbFNpZCddKTtcbiAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0ID0gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5wYXJhbWV0ZXJzWydDYWxsU2lkJ10gIT09IGNhbGwucGFyYW1ldGVyc1snQ2FsbFNpZCddKTtcbiAgfVxuICBuZXdJbmNvbWluZ0NhbGxJbml0aWF0ZWQoKSB7XG4gICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICB0aGlzLm5ld0luY29taW5nQ2FsbHMgPSBbXTtcbiAgICB0aGlzLmluY29taW5nQ2FsbEluaXRpYXRlZC5lbWl0KCk7XG4gIH1cbiAgaW5jb21pbmdDYWxsc05ld0luZm8oZGF0YTphbnkpe1xuICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSBkYXRhO1xuICAgIHRoaXMuaW5jb21pbmdDYWxsc05ld0luZm9FdmVudC5lbWl0KGRhdGEpO1xuICB9XG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZygnQ2xlYW5pbmcgdXAgQzJjRGlhbHBhZENvbXBvbmVudCcpO1xuICAgICAgXG4gICAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFsbCBzdWJzY3JpcHRpb25zXG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbmQgYW55IGFjdGl2ZSBjYWxsXG4gICAgICBpZiAodGhpcy5pc0NhbGxJblByb2dyZXNzKSB7XG4gICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDbGVhciBhbnkgdGltZW91dHMgb3IgaW50ZXJ2YWxzIGlmIHRoZXkgZXhpc3RcbiAgICAgIGlmICh0aGlzLnRvYXN0VGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50b2FzdFRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnQzJjRGlhbHBhZENvbXBvbmVudCBjbGVhbnVwIGNvbXBsZXRlJyk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGNvbXBvbmVudCBjbGVhbnVwOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgaWQ9XCJkcmFncGFyZW50MVwiIFtuZ1N0eWxlXT1cInsnZGlzcGxheSc6aXNEaWFscGFkSGlkZGVuID8gJ25vbmUnOiAnYmxvY2snfVwiPlxyXG4gICAgPCEtLSA8YXBwLWNhbGwtcHJvZ3Jlc3MgKm5nSWY9XCJpc0NhbGxJblByb2dyZXNzXCJcclxuICAgICAoZW5kQ2FsbEV2ZW50KT1cImVuZENhbGwoKVwiXHJcbiAgICAgKG1pbmltaXNlRXZlbnQpID0gXCJvbk1pbmltaXNlKCRldmVudClcIlxyXG4gICAgIChpbmNvbWluZ0NhbGxJbml0aWF0ZWQpPVwibmV3SW5jb21pbmdDYWxsSW5pdGlhdGVkKClcIlxyXG4gICAgIFtuZXdJbmNvbWluZ0NhbGxEYXRhXT1cIm5ld0luY29taW5nQ2FsbERhdGFcIlxyXG4gICAgIFtuZXdJbmNvbWluZ0NhbGxzTGlzdF09XCJpbmNvbWluZ0NhbGxzTGlzdFwiXHJcbiAgICAgKGluY29taW5nQ2FsbHNOZXdJbmZvKT1cImluY29taW5nQ2FsbHNOZXdJbmZvKCRldmVudClcIlxyXG4gICAgICBbY2FsbERhdGFdPVwiY2FsbERhdGFcIj48L2FwcC1jYWxsLXByb2dyZXNzPiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkaWFscGFkLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cInsnbWluaS1kaWFscGFkJzogaXNNaW5pbWlzZWR9XCIgdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwiaGFuZGxlRGl2S2V5ZG93bigkZXZlbnQpXCI+XHJcbiAgICAgIDxkaXYgaWQ9XCJ0b3BQYW5lbFwiIFtuZ1N0eWxlXT1cInsnaGVpZ2h0JzogY2FsbGVySWRMaXN0Lmxlbmd0aCA/ICc0MCUnIDogJzM5JSd9XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxwYWQtYWxlcnRzXCIgKm5nSWY9XCJkaWFsQWxlcnQuc2hvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXNlbGVjdGlvbi1hbGVydFwiPlxyXG4gICAgICAgICAgICA8IS0tIDxwIGNsYXNzPVwibWItMFwiPlNlbGVjdCBDMkMgbnVtYmVyIHRvIGNhbGw8L3A+IC0tPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj57e2RpYWxBbGVydC5tc2d9fTwvcD5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS10aW1lc1wiIChjbGljayk9XCJzaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxwYWQtYWxlcnRzXCIgKm5nSWY9XCJjYWxsTnVtYmVyVG9hc3Quc2hvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxib3gtcG9wMSBhbGVydCBmYWRlIHNob3dcIiBbbmdDbGFzc109XCJjYWxsTnVtYmVyVG9hc3QudHlwZVwiIHJvbGU9XCJhbGVydFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xIG15LWF1dG8gdGV4dC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICBZb3UnciBjYWxsaW5nIDxzdHJvbmc+e3tjYWxsTnVtYmVyVG9hc3QuZGlzcGxheU51bX19PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWRpc2MgcC0wIHB4LTFcIiAoY2xpY2spPVwiY2FuY2VsRGlhbE51bWJlcigpXCI+Q2FuY2VsIENhbGw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc3VjY2VzcyBidG4tZGlzYyBwLTAgcHgtMlwiPkNvbnRpbnVlPC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAwIDE4cHhcIiAocGFzdGUpPVwiaGFuZGxlTnVtYmVyUGFzdGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtdC0yXCI+XHJcbiAgICAgICAgICAgIDxwPjwvcD5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cImhpZGVEaWFscGFkKClcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNHB4XCIgZmlsbD1cIiNmZmZmZmZcIj48cGF0aCBkPVwibTI1Ni0yMDAtNTYtNTYgMjI0LTIyNC0yMjQtMjI0IDU2LTU2IDIyNCAyMjQgMjI0LTIyNCA1NiA1Ni0yMjQgMjI0IDIyNCAyMjQtNTYgNTYtMjI0LTIyNC0yMjQgMjI0WlwiLz48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtYm94XCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiICNkaWFsSW5wdXQgcGxhY2Vob2xkZXI9XCJFbnRlciBhIG5hbWUgb3IgbnVtYmVyXCIgdGFiaW5kZXg9XCIxXCIgWyhuZ01vZGVsKV09XCJkaWFsZWROdW1iZXJcIiAobmdNb2RlbENoYW5nZSk9XCJvbkRpYWxJbnB1dENoYW5nZSgkZXZlbnQpXCIvPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIlwiIGlkPVwiaW5wdXQtY2xlYXItYnRuXCIgKGNsaWNrKT1cImNsZWFySW5wdXQoKVwiICpuZ0lmPVwic2hvd0lucHV0Q2xlYXJCdG5cIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTBweFwiIGhlaWdodD1cIjMwcHhcIiB2aWV3Qm94PVwiMCAxMCA0MCA2MFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2ZXJzaW9uPVwiMS4xXCIgYmFzZVByb2ZpbGU9XCJmdWxsXCIgZW5hYmxlLWJhY2tncm91bmQ9XCJuZXcgMCAwIDc2LjAwIDc2LjAwXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCIjNWQ2MDYxXCIgZmlsbC1vcGFjaXR5PVwiMVwiIHN0cm9rZS13aWR0aD1cIjAuMlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgZD1cIk0gNDcuNTI4Miw0Mi45NDk3TCA0Mi41Nzg0LDM4TCA0Ny41MjgyLDMzLjA1MDJMIDQ0Ljk0OTcsMzAuNDcxOEwgNDAsMzUuNDIxNkwgMzUuMDUwMiwzMC40NzE4TCAzMi40NzE4LDMzLjA1MDJMIDM3LjQyMTYsMzhMIDMyLjQ3MTgsNDIuOTQ5N0wgMzUuMDUwMiw0NS41MjgyTCA0MCw0MC41Nzg0TCA0NC45NDk3LDQ1LjUyODJMIDQ3LjUyODIsNDIuOTQ5NyBaIE0gMTguMDE0Nyw0MS41MzU1TCAyNi45NjQ2LDUwLjQ4NTRDIDI4LjA2ODMsNTEuNTg5IDI5LDUyIDMxLDUyTCA1Miw1MkMgNTQuNzYxNCw1MiA1Nyw0OS43NjE0IDU3LDQ3TCA1NywyOUMgNTcsMjYuMjM4NiA1NC43NjE0LDI0IDUyLDI0TCAzMSwyNEMgMjksMjQgMjguMDY4MywyNC40MTEzIDI2Ljk2NDYsMjUuNTE0OUwgMTguMDE0NywzNC40NjQ1QyAxNi4wNjIxLDM2LjQxNzEgMTYuMDYyMSwzOS41ODI5IDE4LjAxNDcsNDEuNTM1NSBaIE0gMzEsNDlDIDMwLDQ5IDI5LjYwNDgsNDguODgyOCAyOS4wODYsNDguMzY0MUwgMjAuMTM2MSwzOS40MTQyQyAxOS4zNTUsMzguNjMzMiAxOS4zNTUsMzcuMzY2OSAyMC4xMzYxLDM2LjU4NThMIDI5LjA4NiwyNy42MzYyQyAyOS42MDQ4LDI3LjExNzUgMzAsMjcgMzEsMjcuMDAwMUwgNTIsMjcuMDAwMUMgNTMuMTA0NiwyNy4wMDAxIDU0LDI3Ljg5NTUgNTQsMjkuMDAwMUwgNTQsNDcuMDAwMUMgNTQsNDguMTA0NiA1My4xMDQ2LDQ5LjAwMDEgNTIsNDkuMDAwMUwgMzEsNDkgWiBcIi8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+ICAgICAgICBcclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWluZm8taWNvblwiIHBsYWNlbWVudD1cImJvdHRvbS1yaWdodFwiIHRvb2x0aXBDbGFzcz1cImlucHV0LXRvb2x0aXBcIiBuZ2JUb29sdGlwPVwiRm9yIGV4dGVuc2lvbiBkaWFsaW5nLCB1c2UgZm9ybWF0cyBsaWtlICsxMjM0NTY3ODkxMCB4MTIzLCsxMjM0NTY3ODkxMCBleHQuMTIzLCArMTIzNDU2Nzg5MTAsMTIzXCI+PGkgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZVwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWlkZVwiICpuZ0lmPVwiY2FsbGVySWRMaXN0Lmxlbmd0aCAmJiAhKGRpYWxlZE51bWJlci5sZW5ndGggPiAyKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImd1aWRldGV4dFwiPlBsZWFzZSBlbnRlciBhIG51bWJlciBvciBzZWxlY3QgYSBzYXZlZCBjb250YWN0PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJpbnB1dC1lcnJvclwiICpuZ0lmPVwiZGlhbEFsZXJ0LnNob3dcIj5cclxuICAgICAgICAgICAgPHNwYW4+e3tkaWFsQWxlcnQubXNnfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1jYXJkXCIgKm5nRm9yPVwibGV0IGNvbnRhY3Qgb2YgZmlsdGVyZWRDb250YWN0TGlzdFwiIChjbGljayk9XCJvbkNvbnRhY3RTZWxlY3QoY29udGFjdClcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbWdcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjb250YWN0LmltYWdlXCIgYWx0PVwidXNlciBpbWFnZVwiIGxvYWRpbmc9XCJsYXp5XCIgKm5nSWY9XCJjb250YWN0LmltYWdlIGVsc2UgYWxwaGFOYW1lXCIvPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNhbHBoYU5hbWU+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29udGFjdC1hbHBoYS1pbWdcIj57e2dldEZpcnN0TGV0dGVyKGNvbnRhY3QuZmlyc3ROYW1lKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1kZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDRweFwiIGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tnZXRGdWxsTmFtZShjb250YWN0KSB9fTwvcD5cclxuICAgICAgICAgICAgICAgIDxwPnt7Y29udGFjdC5udW1iZXJzTGlzdFswXS5udW1iZXJ9fTwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2F2ZS1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgY2xhc3M9XCJ3YXZlc1wiXHJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIlxyXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAyNCAxNTAgMjhcIlxyXG4gICAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiXHJcbiAgICAgICAgICAgIHNoYXBlLXJlbmRlcmluZz1cImF1dG9cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgaWQ9XCJnZW50bGUtd2F2ZVwiXHJcbiAgICAgICAgICAgICAgICBkPVwiTS0xNjAgNDRjMzAgMCA1OC0xOCA4OC0xOHMgNTggMTggODggMTggNTgtMTggODgtMTggNTggMTggODggMTggdjQ0aC0zNTJ6XCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgIDxnIGNsYXNzPVwicGFyYWxsYXhcIj5cclxuICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCJcclxuICAgICAgICAgICAgICAgIHg9XCI0OFwiXHJcbiAgICAgICAgICAgICAgICB5PVwiMFwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjcpXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIlxyXG4gICAgICAgICAgICAgICAgeD1cIjQ4XCJcclxuICAgICAgICAgICAgICAgIHk9XCIzXCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNSlcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPCEtLSA8dXNlXHJcbiAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCJcclxuICAgICAgICAgICAgICAgIHg9XCI0OFwiXHJcbiAgICAgICAgICAgICAgICB5PVwiNVwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjMpXCJcclxuICAgICAgICAgICAgICAvPiAtLT5cclxuICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiN1wiIGZpbGw9XCIjZmZmXCIgLz5cclxuICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRhaW5lclwiICpuZ0lmPVwiIWlzTWluaW1pc2VkXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRpYWwtYnRuXCIgKm5nRm9yPVwibGV0IGtleSBvZiBrZXlwYWRWYWw7bGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25FbnRlcihrZXkubnVtKVwiIChjbGljayk9XCJhZGROdW1iZXIoa2V5Lm51bSlcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IGtleS50ZXh0ID09PSAnKycgPyAnM3B4JyA6ICcwJ31cIlxyXG4gICAgICAgICBbdGFiaW5kZXhdPVwiZGlhbGVkTnVtYmVyLmxlbmd0aCA/ICcwJzogaSsyXCIgbG9uZ1ByZXNzIChsb25nUHJlc3MpPVwiYWRkTnVtYmVyKGtleS50ZXh0KVwiIHNob3J0UHJlc3MgKHNob3J0UHJlc3MpPVwiYWRkTnVtYmVyKGtleS5udW0pXCI+XHJcbiAgICAgICAgICB7e2tleS5udW19fSBcclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwia2V5Lm51bSA9PSAxO2Vsc2Ugb3RoZXJUaGFuT25lXCIgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHZvaWNlbWFpbFwiPlxyXG4gICAgICAgICAgICB2b2ljZW1haWxcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3RoZXJUaGFuT25lPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1hbGJoYWJldHNcIiBbbmdDbGFzc109XCJ7J3BsdXNTaWduJzoga2V5LnRleHQgPT09ICcrJ31cIj57e2tleS50ZXh0ID8ga2V5LnRleHQgOiAnJm5ic3A7J319PC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWJ0bi1jb250YWluZXJcIiAqbmdJZj1cIiFpc01pbmltaXNlZFwiIChtb3VzZWVudGVyKT1cIm9uQ2FsbEJ0bk1vdXNlRW50ZXIoJGV2ZW50KVwiIChtb3VzZWxlYXZlKT1cIm9uQ2FsbEJ0bk1vdXNlTGVhdmUoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWJ0blwiIChjbGljayk9XCJpbml0aWF0ZUNhbGwoKVwiIFt0YWJpbmRleF09XCJkaWFsZWROdW1iZXIubGVuZ3RoID8gJzInOiAnMTUnXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cInsncG9pbnRlci1ldmVudHMnOiBkaWFsZWROdW1iZXIubGVuZ3RoICYmIHNlbGVjdGVkQ2FsbGVySWQgPyAnYXV0bycgOiAnbm9uZScsICdvcGFjaXR5JzogZGlhbGVkTnVtYmVyLmxlbmd0aCAmJiBzZWxlY3RlZENhbGxlcklkID8gJzEnIDogJzAuNSd9XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPlxyXG4gICAgICAgICAgICBjYWxsXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiY2FsbGVySWRMaXN0Lmxlbmd0aCAmJiAhaXNNaW5pbWlzZWRcIiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNob3duQ2FsbGVySWRcIiAqbmdJZj1cInNlbGVjdGVkQ2FsbGVySWQ7IGVsc2UgYXNrQmxvY2tcIiAoY2xpY2spPVwidG9nZ2xlQ2FsbGVySWREaXYoKVwiPlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiJ2ZpIGZpLScgKyBzZWxlY3RlZENhbGxlcklkPy5pc29Db2RlPy50b0xvd2VyQ2FzZSgpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICB7e3NlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcn19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2Fza0Jsb2NrPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNob3duQ2FsbGVySWRcIiAgKGNsaWNrKT1cInRvZ2dsZUNhbGxlcklkRGl2KClcIiBbbmdDbGFzc109XCJ7ICd0aWx0LXNoYWtpbmcnOiBzaGFrZURlZGljYXRlZEJ0biB9XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTBcIj5TZWxlY3QgQzJDIG51bWJlcjwvaDU+XHJcbiAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cIm1sLTJcIiBzdHlsZT1cIm9wYWNpdHk6Ljg7bWFyZ2luLXRvcDoycHhcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ltYWdlcy9pY29uX2Rvd25fYXJyb3cuc3ZnXCIgYWx0PVwiZG93blwiIHdpZHRoPVwiMTBweFwiPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hbmdsZS1kb3duIG1sLTIgdGV4dC1ibHVlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjJweFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJndWlkZTJcIiAqbmdJZj1cInNoYWtlRGVkaWNhdGVkQnRuXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImd1aWRldGV4dFwiPlBsZWFzZSBzZWxlY3QgYSBudW1iZXIgZnJvbSBiZWxvdyBkcm9wZG93bjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJjYWxsZXJJZExpc3QubGVuZ3RoOyBlbHNlIG5vQ2FsbGVySWRNZXNzYWdlXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXItaWQtbGlzdC1jb250YWluZXJcIiAqbmdJZj1cImNhbGxlcklkTGlzdC5sZW5ndGggJiYgIWlzTWluaW1pc2VkXCIgaWQ9XCJjYWxsZXJJZENvbnRhaW5lclwiICBbbmdDbGFzc109XCJ7J3Zpc2libGUnOiAhaXNDYWxsZXJJZEhpZGRlbn1cIiA+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlblwiPlxyXG4gICAgICAgICAgPCEtLSA8aDQ+U2VsZWN0IEMyQyBTb2Z0cGhvbmUgTnVtYmVyPC9oND4gLS0+XHJcbiAgICAgICAgICAgPGg0Pk1ha2Ugb3V0Z29pbmcgY2FsbCB1c2luZzwvaDQ+XHJcbiAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIlxyXG4gICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJpc0NhbGxlcklkSGlkZGVuID0gdHJ1ZVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIGNsb3NlXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHVsPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2FsbGVySWQgb2YgY2FsbGVySWRMaXN0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGxpIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRDYWxsZXJJZENsYXNzJzogY2FsbGVySWQ/Lm51bWJlciA9PSBzZWxlY3RlZENhbGxlcklkPy5udW1iZXJ9XCIgKGNsaWNrKT1cIm9uRGVkaWNhdGVkTnVtU2VsZWN0KGNhbGxlcklkKVwiPlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCInZmkgZmktJyArIGNhbGxlcklkPy5pc29Db2RlPy50b0xvd2VyQ2FzZSgpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAge3tjYWxsZXJJZD8ubnVtYmVyfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8c3Bhbj57e2NhbGxlcklkPy5jb3VudHJ5TmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xpPiAtLT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNub0NhbGxlcklkTWVzc2FnZT5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm5vLWNhbGxlci1pZC1tZXNzYWdlXCI+VG8gbWFrZSBhbnkgdm9pY2UgY2FsbHMsIHBsZWFzZSA8YSByb3V0ZXJMaW5rPVwiL2V4dGVuc2lvbi9kZWRpY2F0ZWRudW1iZXIve3t0b2tlbn19XCIgY2xhc3M9XCJjbGljay1oZXJlLWxpbmtcIiB0aXRsZT1cIlNldHRpbmdzID4gQzJDIE51bWJlclwiPnN1YnNjcmliZTwvYT4gdG8gYSB2b2ljZSBjYXBhYmxlIEMyQyBOdW1iZXIuXHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGVkaWNhdGVkLW92ZXJsYXlcIiAqbmdJZj1cInNob3dEZWRpY2F0ZWRQb3B1cFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGRlZGljYXRlZE51bVBvcHVwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgY2hvb3NlRGVkaWNhdGVkSGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxoNT5DaG9vc2UgQzJDIE51bWJlcjwvaDU+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBkaWFsLWNsb3NlLWJ0blwiIChjbGljayk9XCJzaG93RGVkaWNhdGVkUG9wdXAgPSBmYWxzZVwiPmNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGRlZGljYXRlZE51bUxpc3RcIj5cclxuICAgICAgICAgICAgPHVsPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhbGxlcklkIG9mIGNhbGxlcklkTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRDYWxsZXJJZENsYXNzJzogY2FsbGVySWQ/Lm51bWJlciA9PSBzZWxlY3RlZENhbGxlcklkPy5udW1iZXJ9XCIgKGNsaWNrKT1cInNob3dEZWRpY2F0ZWRQb3B1cCA9IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiJ2ZpIGZpLScgKyBjYWxsZXJJZD8uaXNvQ29kZT8udG9Mb3dlckNhc2UoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB7e2NhbGxlcklkPy5udW1iZXJ9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3tjYWxsZXJJZD8uY291bnRyeU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1jYWxsLXdpZGdldFwiICpuZ0Zvcj1cImxldCBjYWxsIG9mIG5ld0luY29taW5nQ2FsbHM7bGV0IGkgPSBpbmRleFwiIFtuZ1N0eWxlXT1cInsndG9wJzogKDMwICsgaSAqIDcyKSArICdweCd9XCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmMtdXNlci1pbWdcIj5cclxuICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL3VzZXIuanBnXCIgYWx0PVwidXNlciBpbWFnZVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICBcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgIDwhLS0gPGg2IGNsYXNzPVwibWItMSBmb250LXdlaWdodC1ib2xkXCI+SW5jb21pbmcgQ2FsbDwvaDY+IC0tPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJpbmMtdXNlci1uYW1lXCI+e3tjYWxsLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCduYW1lJyl9fTwvcD5cclxuICAgICAgICAgIDxwPnt7Y2FsbC5wYXJhbWV0ZXJzLkZyb219fTwvcD5cclxuICBcclxuICAgICAgICAgIDwhLS0gPHAgY2xhc3M9XCJpbmMtdXNlci1uYW1lXCI+Sm9obiBEb2U8L3A+IFxyXG4gICAgICAgICAgPHA+KzEyMzM3NDcyNDg5PC9wPlxyXG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDEycHg7Y29sb3I6I2Q1ZDVkNSAhaW1wb3J0YW50O21hcmdpbi10b3A6MnB4XCI+Q2FsbCBvbiArMTIyNjQ1ODQxMDA8L3A+IC0tPlxyXG4gIFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbmMtY2FsbC1idG4gaW5jLWFjY2VwdC1idG4gbXItMlwiIChjbGljayk9XCJhY2NlcHROZXdJbmNvbWluZ0NhbGwoY2FsbClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj5cclxuICAgICAgICAgICAgICBjYWxsXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPCEtLSA8YnV0dG9uIGNsYXNzPVwiaW5jLWNhbGwtYnRuIGluYy1yZWplY3QtYnRuXCIgKGNsaWNrKT1cInJlamVjdE5ld0luY29taW5nQ2FsbChjYWxsKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPlxyXG4gICAgICAgICAgICAgIGNhbGxfZW5kXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgIFxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gICJdfQ==
|
|
971
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU8vSSxzR0FBc0c7QUFDdEcsd0RBQXdEO0FBQ3hELE9BQW1DLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFLMUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQVNwQyxNQUFNLE9BQU8sZ0JBQWdCO0lBNkQzQixZQUNVLGFBQTRCLEVBQzVCLFVBQTRCO0lBQ3BDLDZCQUE2QjtJQUNyQixTQUEyQixFQUMzQixnQkFBa0MsRUFDbEMsTUFBYztRQUxkLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBRTVCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQWxFZixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNoQyxzQkFBaUIsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNqRSxrQkFBYSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzNELGlCQUFZLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFDNUQsa0JBQWEsR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUNuRSw4QkFBeUIsR0FBd0IsSUFB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RUFBRSxDQUFDO2FBQ2xDO1lBRUQsc0JBQXNCO1lBQ3RCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUN6QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDaEI7WUFFRCxnREFBZ0Q7WUFDaEQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNyQixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2pDO1lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBRXJEO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQzs7OEdBbmdDVSxnQkFBZ0I7a0dBQWhCLGdCQUFnQixnZ0JDeEI3Qix1dVpBZ1BBOzRGRHhOYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsYUFBYTtzTkFLZCxlQUFlO3NCQUF2QixLQUFLO2dCQUNJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNpQixnQkFBZ0I7c0JBQXZDLFNBQVM7dUJBQUMsV0FBVztnQkFHWixZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG4vLyBpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuLy8gaW1wb3J0IHsgVHdpbGlvU2VydmljZSB9IGZyb20gJ3NyYy9hcHAvZXh0ZW5zaW9uL3R3aWxpby5zZXJ2aWNlJztcbi8vIGltcG9ydCBzd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcbmltcG9ydCB7IEV4dGVuc2lvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvZXh0ZW5zaW9uLnNlcnZpY2UnO1xuLy8gaW1wb3J0IHsgQ2FsbGVySWREaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY2FsbGVyLWlkLWRpYWxvZy9jYWxsZXItaWQtZGlhbG9nLmNvbXBvbmVudCc7XG4vLyBpbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHBhcnNlUGhvbmVOdW1iZXJGcm9tU3RyaW5nLCB7IEFzWW91VHlwZSB9IGZyb20gJ2xpYnBob25lbnVtYmVyLWpzJztcbmltcG9ydCB7IElwQWRkcmVzc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvaXAtYWRkcmVzcy5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cblxuaW1wb3J0IHsga2V5cGFkIH0gZnJvbSAnLi4va2V5cGFkJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2FsbCB9IGZyb20gJ0B0d2lsaW8vdm9pY2Utc2RrJztcbmltcG9ydCB7IFR3aWxpb1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvdHdpbGlvLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGlhbGJveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kaWFsYm94LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGlhbGJveC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGlhbGJveENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGlzRGlhbHBhZEhpZGRlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgY2xvc2VEaWFscGFkRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNhbGxJbml0aWF0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBlbmRDYWxsRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG1pbmltaXNlRXZlbnQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGluY29taW5nQ2FsbHNOZXdJbmZvRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsSW5pdGlhdGVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoJ2RpYWxJbnB1dCcpIGRpYWxJbnB1dEVsZW1lbnQhOiBFbGVtZW50UmVmO1xuXG4gIFxuICBAT3V0cHV0KCkgbnVtYmVyRGlhbGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cblxuICBpc0NhbGxJblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XG4gIGtleXBhZFZhbCA9IGtleXBhZDtcbiAgXG4gIHNob3dJbnB1dENsZWFyQnRuOiBib29sZWFuID0gZmFsc2U7XG4gIGRpYWxlZE51bWJlcjogc3RyaW5nID0gJyc7XG4gIGNvbnRhY3RMaXN0OiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJlZENvbnRhY3RMaXN0OiBhbnlbXSA9IFtdO1xuICBjYWxsZXJJZExpc3Q6IGFueVtdID0gW107XG4gIHNlbGVjdGVkQ2FsbGVySWQ6IGFueTtcbiAgaXNDYWxsZXJJZEhpZGRlbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgaXNUcmlhbFBlcmlvZE92ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNQYXltZW50RHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHRlcm1pbmF0ZUNhbGwgPSBmYWxzZTtcbiAgdG9hc3RUaW1lb3V0ID0gNzAwMDtcbiAgY2FsbE51bWJlclRvYXN0ID0ge1xuICAgIHNob3c6IGZhbHNlLFxuICAgIHR5cGU6ICdhbGVydC1zdWNjZXNzJyxcbiAgICBudW1iZXI6ICcnLFxuICAgIGRpc3BsYXlOdW06ICcnXG4gIH1cbiAgY2FsbERhdGE6IGFueSA9IHtcbiAgICBwaG9uZTogJycsXG4gICAgZGlzcGxheU51bTogJycsXG4gICAgZGlhbDogZmFsc2UsXG4gICAgbmFtZTogJycsXG4gICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgIGV4dE51bTonJ1xuICB9O1xuICBsYXN0RGlhbGVkOiB7IG5hbWU/OiBzdHJpbmc7IGltYWdlPzogc3RyaW5nOyBudW1iZXI6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIHNhbml0aXplZE51bTogYW55O1xuICBkaWFsQWxlcnQgPSB7XG4gICAgbXNnOiAnJyxcbiAgICBzaG93OiBmYWxzZVxuICB9XG4gIHRva2VuOiBhbnk7XG5cbiBcbiAgc2hvd0RlZGljYXRlZFBvcHVwOmJvb2xlYW4gPSBmYWxzZTtcbiAgbmV3SW5jb21pbmdDYWxsczogYW55ID0gW107XG4gIGluY29taW5nQ2FsbHNMaXN0OiBhbnkgPSBbXTtcbiAgbmV3SW5jb21pbmdDYWxsRGF0YT86Q2FsbDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIGNhbGxQcmVmZXJlbmNlOmFueTtcbiAgc2hha2VEZWRpY2F0ZWRCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTbWFydERpYWxDYWxsOmJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0d2lsaW9TZXJ2aWNlOiBUd2lsaW9TZXJ2aWNlLFxuICAgIHByaXZhdGUgZXh0U2VydmljZTogRXh0ZW5zaW9uU2VydmljZSxcbiAgICAvLyBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgaXBTZXJ2aWNlOiBJcEFkZHJlc3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXh0ZW5zaW9uU2VydmljZTogRXh0ZW5zaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRyeXtcbiAgICAgIHRoaXMudG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyk7XG4gICAgICAvL3RoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7IFxuICAgICAgdGhpcy5nZXRDb250YWN0TGlzdCgpO1xuICAgICAgXG4gICAgICAvLyB0aGlzLmdldFVzZXJDYWxsU2V0dGluZygpO1xuICAgICAgY29uc3Qgc3ViMSA9IHRoaXMudHdpbGlvU2VydmljZS5kaWFsTnVtYmVyRnJvbU90aGVyTW9kdWxlLnN1YnNjcmliZSgoY29udGFjdDphbnkpID0+IHtcbiAgICAgICAgaWYgKGNvbnRhY3QubnVtYmVyKSB7XG4gICAgICAgICAgdGhpcy5pc1NtYXJ0RGlhbENhbGwgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoY29udGFjdC5pc0RpYWxGcm9tSGlzdG9yeSkge1xuICAgICAgICAgICAgLy9oYW5kbGUgZGlhbGluZyBmcm9tIGhpc3RvcnkgcGFnZVxuICAgICAgICAgICAgaWYoY29udGFjdC5jYWxsZXJJZCA9PSAnc21hcnREaWFsaW5nJyl7XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IHsgbnVtYmVyOiBjb250YWN0LmZyb20gfTtcbiAgICAgICAgICAgICAgdGhpcy5pc1NtYXJ0RGlhbENhbGwgPSB0cnVlO1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBjb250YWN0Lm5hbWU7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gY29udGFjdC5pbWc7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuZnJvbSA9IGNvbnRhY3QuZnJvbTtcbiAgICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgICAgLy8gdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oY29udGFjdCk7XG4gICAgICAgICAgICAvLyB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnB1c2goY29udGFjdClcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhdGVDYWxsKCk7XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAvLyB0aGlzLmdldFVzZXJDYWxsU2V0dGluZygpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIC8vIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGNvbnRhY3QpO1xuICAgICAgICAgICAgLy8gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5wdXNoKGNvbnRhY3QpXG4gICAgICAgICAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250YWN0LmNhbGxlcklkID09ICdhbHdheXNBc2snIHx8IGNvbnRhY3QuY2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpIHtcbiAgICAgICAgICAgICAgLy8gdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gY29udGFjdC5uYW1lO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmltZyA9IGNvbnRhY3QuaW1nO1xuICAgICAgICAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgICB0aGlzLmluaXRpYXRlQ2FsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgfSlcbiAgXG4gICAgICAvLyBoYW5kbGUgaW5jb21pbmcgY2FsbFxuICAgICAgY29uc3Qgc3ViMiA9IHRoaXMudHdpbGlvU2VydmljZS5jdXJyZW50Q2FsbC5zdWJzY3JpYmUoaW5jb21pbmdDYWxsRGF0YSA9PiB7XG4gICAgICAgIC8vIGlmIChpbmNvbWluZ0NhbGxEYXRhKSB7XG4gICAgICAgIC8vICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgLy8gICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAvLyAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBpbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMuRnJvbTtcbiAgICAgICAgLy8gICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCduYW1lJyk7XG4gICAgICAgIC8vICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCdpbWFnZScpO1xuICAgICAgICAvLyAgIHRoaXMuY2FsbERhdGEuaXNJbmNvbWluZ0NhbGwgPSB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIGlmIChpbmNvbWluZ0NhbGxEYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNDYWxsSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzLnB1c2goaW5jb21pbmdDYWxsRGF0YSk7XG4gICAgICAgICAgICAvLyB0aGlzLmdldFVzZXJJbmZvcm1hdGlvbihpbmNvbWluZ0NhbGxEYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gaW5jb21pbmdDYWxsRGF0YS5wYXJhbWV0ZXJzWydGcm9tJ107XG4gICAgICAgICAgICAvLyB0aGlzLmdldFVzZXJJbmZvcm1hdGlvbihpbmNvbWluZ0NhbGxEYXRhKTtcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IGluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycy5nZXQoJ25hbWUnKTtcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzLmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmlzSW5jb21pbmdDYWxsID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5jb21pbmdDYWxsRGF0YS5vbignY2FuY2VsJywgKCkgPT4ge1xuICAgICAgICAgICAgLy8gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IHRoaXMuaW5jb21pbmdDYWxsc0xpc3QuZmlsdGVyKChpdGVtOmFueSkgPT4gaXRlbS5wYXJhbWV0ZXJzLkNhbGxTaWQgIT09IGluY29taW5nQ2FsbERhdGEucGFyYW1ldGVycy5DYWxsU2lkKTtcbiAgICAgICAgICAgIGlmKHRoaXMuaW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGluY29taW5nQ2FsbERhdGEub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbHRlcigoaXRlbTphbnkpID0+IGl0ZW0ucGFyYW1ldGVycy5DYWxsU2lkICE9PSBpbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMuQ2FsbFNpZCk7XG4gICAgICAgICAgICAgIGlmKHRoaXMuaW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHN1YjEpO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWIyKTtcbiAgICB9Y2F0Y2goZSl7XG4gICAgICBjb25zb2xlLmxvZyhlKVxuICAgIH1cbiAgICBcbiAgfVxuXG4gIFxuICAvLyBnZXRVc2VySW5mb3JtYXRpb24oaW5jb21pbmdDYWxsRGF0YTogYW55KSB7XG4gIC8vICAgbGV0IGRhdGEgPSB0aGlzLmZyb21FbnRyaWVzKEFycmF5LmZyb20oaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzLmVudHJpZXMoKSkpO1xuICAvLyAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24oZGF0YS50d2lsaW9BdXRoSWQpLnN1YnNjcmliZShcbiAgLy8gICByZXNwb25zZSA9PiB7XG4gIC8vICAgICBpbmNvbWluZ0NhbGxEYXRhWyd1c2VySW5mbyddPXJlc3BvbnNlXG4gIC8vICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnB1c2goaW5jb21pbmdDYWxsRGF0YSk7XG4gIC8vICAgfSwgZXJyb3IgPT4ge1xuICAvLyAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgZnJvbUVudHJpZXMoZW50cmllczogW3N0cmluZywgYW55XVtdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIGVudHJpZXMucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5yZWdpc3RlckRyYWdFbGVtZW50KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2lzRGlhbHBhZEhpZGRlbiddICYmICF0aGlzLmlzRGlhbHBhZEhpZGRlbikge1xuICAgICAgdGhpcy5nZXRDb250YWN0TGlzdCgpO1xuICAgICAgLy8gdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRpYWxJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcmVnaXN0ZXJEcmFnRWxlbWVudCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZWxtbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhZ3BhcmVudDEnKTtcblxuICAgICAgbGV0IHBvczEgPSAwLCBwb3MyID0gMCwgcG9zMyA9IDAsIHBvczQgPSAwO1xuXG4gICAgICBjb25zdCBkcmFnTW91c2VEb3duID0gKGU6YW55KSA9PiB7XG4gICAgICAgIC8vIElmIHRoZSB0YXJnZXQgaXMgYW4gaW5wdXQsIHJldHVybiBhbmQgZG9uJ3QgaW5pdGlhdGUgZHJhZ2dpbmdcbiAgICAgICAgaWYgKGUudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcbiAgICAgICAgLy8gZ2V0IHRoZSBtb3VzZSBjdXJzb3IgcG9zaXRpb24gYXQgc3RhcnR1cDpcbiAgICAgICAgcG9zMyA9IGUuY2xpZW50WDtcbiAgICAgICAgcG9zNCA9IGUuY2xpZW50WTtcbiAgICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gY2xvc2VEcmFnRWxlbWVudDtcbiAgICAgICAgLy8gY2FsbCBhIGZ1bmN0aW9uIHdoZW5ldmVyIHRoZSBjdXJzb3IgbW92ZXM6XG4gICAgICAgIGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gZWxlbWVudERyYWc7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbGVtZW50RHJhZyA9IChlOmFueSkgPT4ge1xuXG4gICAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBuZXcgY3Vyc29yIHBvc2l0aW9uOlxuICAgICAgICBwb3MxID0gcG9zMyAtIGUuY2xpZW50WDtcbiAgICAgICAgcG9zMiA9IHBvczQgLSBlLmNsaWVudFk7XG4gICAgICAgIHBvczMgPSBlLmNsaWVudFg7XG4gICAgICAgIHBvczQgPSBlLmNsaWVudFk7XG4gICAgICAgIC8vIHNldCB0aGUgZWxlbWVudCdzIG5ldyBwb3NpdGlvbjpcbiAgICAgICAgLy8gZWxtbnQuc3R5bGUudG9wID0gZWxtbnQub2Zmc2V0VG9wIC0gcG9zMiArICdweCc7XG4gICAgICAgIC8vIGVsbW50LnN0eWxlLmxlZnQgPSBlbG1udC5vZmZzZXRMZWZ0IC0gcG9zMSArICdweCc7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjbG9zZURyYWdFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICAvKiBzdG9wIG1vdmluZyB3aGVuIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZDoqL1xuICAgICAgICBkb2N1bWVudC5vbm1vdXNldXAgPSBudWxsO1xuICAgICAgICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IG51bGw7XG4gICAgICB9O1xuXG4gICAgICAvLyBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxtbnQuaWQgKyAnaGVhZGVyJykpIHtcbiAgICAgIC8vICAgLyogaWYgcHJlc2VudCwgdGhlIGhlYWRlciBpcyB3aGVyZSB5b3UgbW92ZSB0aGUgRElWIGZyb206Ki9cbiAgICAgIC8vICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxtbnQuaWQgKyAnaGVhZGVyJykub25tb3VzZWRvd24gPSBkcmFnTW91c2VEb3duO1xuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgLyogb3RoZXJ3aXNlLCBtb3ZlIHRoZSBESVYgZnJvbSBhbnl3aGVyZSBpbnNpZGUgdGhlIERJVjoqL1xuICAgICAgLy8gICBlbG1udC5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XG4gICAgICAvLyB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSlcbiAgICB9XG4gIH1cblxuICBhZGROdW1iZXIobnVtOiBhbnkpIHtcbiAgICBpZiAoIG51bSA9PSAnIycgfHwgbnVtID09ICcqJyB8fG51bSA9PSAnKycgfHwgTnVtYmVyLmlzSW50ZWdlcihudW0pKSB7XG4gICAgICBpZiAobnVtID09ICcjJykge1xuICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtaGFzaC0ubXAzYCkucGxheSgpO1xuICAgICAgfSBlbHNlIGlmIChudW0gPT0gJyonKSB7XG4gICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1zdGFyLS5tcDNgKS5wbGF5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtJHtudW19LS5tcDNgKS5wbGF5KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGlhbGVkTnVtYmVyICs9IG51bTtcbiAgICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSB0cnVlO1xuXG4gICAgICB0aGlzLm51bWJlckRpYWxlZC5lbWl0KHRoaXMuZGlhbGVkTnVtYmVyKTtcblxuICAgICAgdGhpcy5vbkRpYWxJbnB1dENoYW5nZSh0aGlzLmRpYWxlZE51bWJlcilcbiAgICAgIC8vIHRoaXMuZGlhbElucHV0UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9ZWxzZSBpZihudW0gPT09ICd2b2ljZW1haWwnKXtcbiAgICAgIC8vIHRoaXMuc2hvd0RlZGljYXRlZFBvcHVwID0gdHJ1ZTtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnZXh0ZW5zaW9uL3ZvaWNlbWFpbC8nK3RoaXMudG9rZW5dKTtcbiAgICB9XG4gIH1cbiAgXG4gIGhpZGVEaWFscGFkKCkge1xuICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLmNsb3NlRGlhbHBhZEV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLmNsZWFyQWxsRGlhbGVkKCk7XG4gICAgdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0ID0gW107XG4gIH1cbiAgXG4gIG9uRGlhbElucHV0Q2hhbmdlKGlucHV0VmFsOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXBkYXRlZCByZWdleCB0byBpbmNsdWRlIHgsIFgsIGV4dC4sIEV4dC4sIGFuZCAsXG4gICAgICBjb25zdCBpc051bWVyaWNJbnB1dCA9IC9eW1xcZFxccytcXC1dKyQvLnRlc3QoaW5wdXRWYWwpO1xuICAgICAgbGV0IG1haW5OdW1iZXIgPSBpbnB1dFZhbDtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGV4dGVuc2lvbiBpbmRpY2F0b3JzIGFuZCBzcGxpdCB0aGUgaW5wdXRcbiAgICAgIGNvbnN0IGV4dE1hdGNoID0gaW5wdXRWYWwubWF0Y2goLyh4fFh8ZXh0XFwufEV4dFxcLnwsKSguKikvKTtcbiAgICAgIGlmIChleHRNYXRjaCkge1xuICAgICAgICBtYWluTnVtYmVyID0gaW5wdXRWYWwuc3Vic3RyaW5nKDAsIGV4dE1hdGNoLmluZGV4KS50cmltKCk7XG4gICAgICAgIHRoaXMuY2FsbERhdGEuZXh0TnVtID0gZXh0TWF0Y2hbMl0udHJpbSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBpc051bWVyaWNJbnB1dCA/IG1haW5OdW1iZXIucmVwbGFjZSgvW1xcc1xcLV0rL2csICcnKSA6IG1haW5OdW1iZXI7XG5cbiAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBpc051bWVyaWNJbnB1dCA/IHRoaXMuc2FuaXRpemVkTnVtIDogJyc7XG4gICAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gaW5wdXRWYWwubGVuZ3RoID4gMDtcblxuICAgICAgaWYgKGlzTnVtZXJpY0lucHV0KSB7XG4gICAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gbmV3IEFzWW91VHlwZSgpLmlucHV0KHRoaXMuc2FuaXRpemVkTnVtKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCBjdXJyZW50IG51bWJlciB3aGVuZXZlciBpbnB1dCBjaGFuZ2VzXG4gICAgICB0aGlzLm51bWJlckRpYWxlZC5lbWl0KHRoaXMuZGlhbGVkTnVtYmVyKTtcblxuICAgICAgaWYgKGlucHV0VmFsLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0ID0gdGhpcy5jb250YWN0TGlzdC5maWx0ZXIoY29udGFjdCA9PiB7XG4gICAgICAgICAgY29uc3QgZnVsbE5hbWUgPSBgJHtjb250YWN0LmZpcnN0TmFtZX0gJHtjb250YWN0Lm1pZGRsZU5hbWV9ICR7Y29udGFjdC5sYXN0TmFtZX1gLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgLy8gcmV0dXJuIGZ1bGxOYW1lLmluY2x1ZGVzKHRoaXMuc2FuaXRpemVkTnVtLnRvTG93ZXJDYXNlKCkpIHx8IGNvbnRhY3QubnVtYmVyc0xpc3Quc29tZShudW0gPT4gbnVtLm51bWJlci5pbmNsdWRlcyh0aGlzLnNhbml0aXplZE51bSkpO1xuICAgICAgICB9KS5zbGljZSgwLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdCA9IFtdO1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Rmlyc3RMZXR0ZXIobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZSA/IG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgfVxuICBjbGVhcklucHV0KCkge1xuICAgIGlmICh0aGlzLmRpYWxlZE51bWJlci5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRpYWxlZE51bWJlciA9IHRoaXMuZGlhbGVkTnVtYmVyLnNsaWNlKDAsIC0xKTtcbiAgICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSB0aGlzLmRpYWxlZE51bWJlci5sZW5ndGggIT09IDA7XG5cbiAgICAgIHRoaXMub25EaWFsSW5wdXRDaGFuZ2UodGhpcy5kaWFsZWROdW1iZXIpXG4gICAgfVxuICB9XG4gIGNsZWFyQWxsRGlhbGVkKCkge1xuICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gJyc7XG4gICAgdGhpcy5zYW5pdGl6ZWROdW0gPSAnJztcbiAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gZmFsc2U7XG4gIH1cbiAgZ2V0Q2FsbGVySWRMaXN0KCkge1xuICAgIHRoaXMuZXh0U2VydmljZS5kaXNwbGF5SUQodGhpcy50b2tlbiB8fCAnJykuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgLy90aGlzLmNhbGxlcklkTGlzdCA9IHJlcy5jYWxsZXJJZExpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbS50eXBlID09PSBcIkMyQyBTb2Z0cGhvbmUgTnVtYmVyXCIpO1xuICAgICAgdGhpcy5jYWxsZXJJZExpc3QgPSByZXMuY2FsbGVySWRMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnZvaWNlRmVhdHVyZSA9PT0gdHJ1ZSk7XG4gICAgICAvLyB0aGlzLmNhbGxlcklkTGlzdCA9IHJlcy5jYWxsZXJJZExpc3Q7XG4gICAgICBpZiAodGhpcy5jYWxsZXJJZExpc3QubGVuZ3RoID09IDEpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENhbGxlcklkID0gdGhpcy5jYWxsZXJJZExpc3RbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5jYWxsUHJlZmVyZW5jZSA9PT0gJ2Fsd2F5c0FzaycgfHwgdGhpcy5jYWxsUHJlZmVyZW5jZSA9PT0gJ3NtYXJ0RGlhbGluZycpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IHRoaXMuY2FsbGVySWRMaXN0LmZpbmQoaXRlbSA9PiAoaXRlbS5udW1iZXIgPT0gdGhpcy5jYWxsUHJlZmVyZW5jZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZ2V0Q29udGFjdExpc3QoKSB7XG4gICAgdGhpcy50d2lsaW9TZXJ2aWNlLmdldENvbnRhY3RMaXN0KCkuc3Vic2NyaWJlKChyZXNwOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXNwLnJlc3BvbnNlID09ICdTdWNjZXNzJykge1xuICAgICAgICB0aGlzLmNvbnRhY3RMaXN0ID0gcmVzcC5waG9uZUJvb2s7XG4gICAgICB9XG4gICAgfSwgZXJyID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGVycilcbiAgICB9KVxuICB9XG4gIGdldEZ1bGxOYW1lKGNvbnRhY3Q6IGFueSk6IHN0cmluZyB7XG4gICAgbGV0IGZ1bGxOYW1lID0gY29udGFjdC5maXJzdE5hbWUgfHwgJyc7XG4gICAgaWYgKGNvbnRhY3QubWlkZGxlTmFtZSkge1xuICAgICAgZnVsbE5hbWUgKz0gYCAke2NvbnRhY3QubWlkZGxlTmFtZX1gO1xuICAgIH1cbiAgICBpZiAoY29udGFjdC5sYXN0TmFtZSkge1xuICAgICAgZnVsbE5hbWUgKz0gYCAke2NvbnRhY3QubGFzdE5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bGxOYW1lLnRyaW0oKTtcbiAgfVxuXG5cbiAgdG9nZ2xlQ2FsbGVySWREaXYoKSB7XG4gICAgdGhpcy5pc0NhbGxlcklkSGlkZGVuID0gIXRoaXMuaXNDYWxsZXJJZEhpZGRlbjtcbiAgfVxuXG4gIG9uQ29udGFjdFNlbGVjdChjb250YWN0OiBhbnkpIHtcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9IGNvbnRhY3QubnVtYmVyc0xpc3RbMF0ubnVtYmVyO1xuICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IHRoaXMuZ2V0RnVsbE5hbWUoY29udGFjdCk7XG4gICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0LmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJztcbiAgICB0aGlzLm9uRGlhbElucHV0Q2hhbmdlKHRoaXMuZGlhbGVkTnVtYmVyKTtcbiAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcbiAgfVxuXG4gIGVuZENhbGwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKCdFbmRpbmcgY2FsbCcpO1xuICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcbiAgICAgIFxuICAgICAgLy8gUmVzZXQgY2FsbCBkYXRhXG4gICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAgICAgICBwaG9uZTogJycsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgICBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcbiAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgICAgICBkaWFsOiBmYWxzZSxcbiAgICAgICAgZGlzcGxheU51bTogJycsXG4gICAgICAgIGV4dE51bTogJydcbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIFJlc2V0IGRpYWxlZCBudW1iZXJcbiAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gJyc7XG4gICAgICB0aGlzLnNhbml0aXplZE51bSA9ICcnO1xuICAgICAgXG4gICAgICAvLyBFbWl0IGVuZCBjYWxsIGV2ZW50XG4gICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XG4gICAgICBjb25zb2xlLmxvZygnQ2FsbCBlbmRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBlbmRDYWxsOicsIGVycm9yKTtcbiAgICAgIC8vIEV2ZW4gaWYgdGhlcmUncyBhbiBlcnJvciwgdHJ5IHRvIHJlc2V0IHRoZSBzdGF0ZVxuICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAgICAgICBwaG9uZTogJycsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgICBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcbiAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgICAgICBkaWFsOiBmYWxzZSxcbiAgICAgICAgZGlzcGxheU51bTogJycsXG4gICAgICAgIGV4dE51bTogJydcbiAgICAgIH07XG4gICAgICB0aGlzLmVuZENhbGxFdmVudC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYXN5bmMgaW5pdGlhdGVDYWxsKCkge1xuICAvLyAgIHRyeSB7XG4gIC8vICAgICBjb25zb2xlLmxvZygnSW5pdGlhdGluZyBjYWxsIHdpdGggbnVtYmVyOicsIHRoaXMuZGlhbGVkTnVtYmVyKTtcbiAgICAgIFxuICAvLyAgICAgaWYgKCF0aGlzLmRpYWxlZE51bWJlciAmJiB0aGlzLmxhc3REaWFsZWQpIHtcbiAgLy8gICAgICAgY29uc29sZS5sb2coJ1VzaW5nIGxhc3QgZGlhbGVkIG51bWJlcjonLCB0aGlzLmxhc3REaWFsZWQubnVtYmVyKTtcbiAgLy8gICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSB0aGlzLmxhc3REaWFsZWQubnVtYmVyO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBjb25zdCBpc0ludmFsaWQgPSBhd2FpdCB0aGlzLmlzSW52YWxpZE51bWJlcigpO1xuICAvLyAgICAgaWYgKGlzSW52YWxpZCkge1xuICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIG51bWJlciBmb3JtYXQnKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICB0aGlzLnNhdmVMYXN0RGlhbGVkKCk7XG4gIC8vICAgICB0aGlzLmlzU2F2ZWRDb250YWN0RGlhbGxlZCgpO1xuICAgICAgXG4gIC8vICAgICAvLyBDaGVjayBwYXltZW50IHN0YXR1c1xuICAvLyAgICAgdGhpcy5pc1BheW1lbnREdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGF5bWVudER1ZScpID09PSAndHJ1ZSc7XG4gIC8vICAgICBpZiAodGhpcy5pc1BheW1lbnREdWUpIHtcbiAgLy8gICAgICAgY29uc29sZS53YXJuKCdQYXltZW50IGlzIGR1ZScpO1xuICAvLyAgICAgICBzd2FsKCdXYXJuaW5nJywgJ1BsZWFzZSBub3RlIHRoYXQgeW91ciBwYXltZW50IGlzIGR1ZS4gVG8gY29udGludWUgdXNpbmcgb3VyIHNlcnZpY2VzLCBraW5kbHkgc3Vic2NyaWJlIHRvIGF2b2lkIGludGVycnVwdGlvbnMuJyk7XG4gIC8vICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgLy8gQ2hlY2sgaWYgZGlhbGluZyBvd24gbnVtYmVyXG4gIC8vICAgICBpZiAodGhpcy5zYW5pdGl6ZWROdW0gPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xuICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdBdHRlbXB0ZWQgdG8gZGlhbCBvd24gbnVtYmVyJyk7XG4gIC8vICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW5ub3QgZGlhbCB5b3VyIG93biBudW1iZXInKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICAvLyBDaGVjayBtaWNyb3Bob25lIHBlcm1pc3Npb25zXG4gIC8vICAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gYXdhaXQgdGhpcy5jaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gIC8vICAgICBpZiAoIWhhc1Blcm1pc3Npb24pIHtcbiAgLy8gICAgICAgY29uc29sZS53YXJuKCdNaWNyb3Bob25lIHBlcm1pc3Npb24gbm90IGdyYW50ZWQnKTtcbiAgLy8gICAgICAgYXdhaXQgdGhpcy5hc2tGb3JNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAvLyAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGlmICghdGhpcy5zZWxlY3RlZENhbGxlcklkKSB7XG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGNhbGxlciBJRCBzZWxlY3RlZCcpO1xuICAvLyAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgLy8gICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdQbGVhc2Ugc2VsZWN0IGEgQzJDIG51bWJlciB0byBjYWxsIGZyb20nKTtcbiAgLy8gICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlO1xuICAvLyAgICAgICB9LCAzMDAwKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBjb25zb2xlLmxvZygnR2V0dGluZyBudW1iZXIgd2l0aCBjb3VudHJ5IGNvZGUuLi4nKTtcbiAgLy8gICAgIHRoaXMuY2FsbERhdGEuZGlzcGxheU51bSA9ICcnO1xuICAgICAgXG4gIC8vICAgICB0cnkge1xuICAvLyAgICAgICBhd2FpdCB0aGlzLmdldFRvTnVtYmVyKHRoaXMuc2FuaXRpemVkTnVtKTtcbiAgLy8gICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdldHRpbmcgbnVtYmVyIHdpdGggY291bnRyeSBjb2RlOicsIGVycm9yKTtcbiAgLy8gICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdFcnJvciBwcm9jZXNzaW5nIG51bWJlci4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBpZiAodGhpcy50ZXJtaW5hdGVDYWxsKSB7XG4gIC8vICAgICAgIGNvbnNvbGUubG9nKCdDYWxsIHRlcm1pbmF0ZWQgYnkgdXNlcicpO1xuICAvLyAgICAgICB0aGlzLnRlcm1pbmF0ZUNhbGwgPSBmYWxzZTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICAvLyBQcmVwYXJlIGNhbGwgZGF0YVxuICAvLyAgICAgdGhpcy5jYWxsRGF0YSA9IHtcbiAgLy8gICAgICAgLi4udGhpcy5jYWxsRGF0YSxcbiAgLy8gICAgICAgcGhvbmU6IHRoaXMuc2FuaXRpemVkTnVtLFxuICAvLyAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gIC8vICAgICAgIGRpYWw6IHRydWUsXG4gIC8vICAgICAgIGZyb206IHRoaXMuaXNTbWFydERpYWxDYWxsID8gdGhpcy5jYWxsRGF0YS5mcm9tIDogdGhpcy5zZWxlY3RlZENhbGxlcklkLm51bWJlcixcbiAgLy8gICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgLy8gICAgIH07XG5cbiAgLy8gICAgIGNvbnNvbGUubG9nKCdJbml0aWF0aW5nIGNhbGwgd2l0aCBkYXRhOicsIHRoaXMuY2FsbERhdGEpO1xuICAvLyAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgLy8gICAgIHRoaXMuY2FsbEluaXRpYXRlZC5lbWl0KHsgLi4udGhpcy5jYWxsRGF0YSB9KTtcbiAgICAgIFxuICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgICBcbiAgLy8gICB9IGNhdGNoIChlcnJvcikge1xuICAvLyAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gaW5pdGlhdGVDYWxsOicsIGVycm9yKTtcbiAgLy8gICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnRmFpbGVkIHRvIGluaXRpYXRlIGNhbGwuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gIC8vICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICB9XG4gIC8vICAgICAvL3RoaXMuY2xlYXJBbGxEaWFsZWQoKTtcbiAgLy8gICAvLyB9IGVsc2Uge1xuICAvLyAgIC8vICAgc3dhbCgnRXJyb3InLCAnVHJpYWwgcGVyaW9kIGlzIG92ZXIuIFBsZWFzZSBzZXR1cCBwYXltZW50IG1ldGhvZCB0byBjb250aW51ZSBzZXJ2aWNlcycpXG4gIC8vICAgLy8gfVxuICAvLyB9XG5cblxuICAvLyAgYXN5bmMgaW5pdGlhdGVDYWxsKCkge1xuICAvLyAgIGlmICghdGhpcy5kaWFsZWROdW1iZXIgJiYgdGhpcy5sYXN0RGlhbGVkKSB7XG4gIC8vICAgICB0aGlzLnNhbml0aXplZE51bSA9IHRoaXMubGFzdERpYWxlZC5udW1iZXI7XG4gIC8vICAgfVxuICAvLyAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKCk7XG4gIC8vICAgaWYgKGlzSW52YWxpZCkge1xuICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgIH1cbiAgLy8gICB0aGlzLnNhdmVMYXN0RGlhbGVkKCk7XG4gIC8vICAgdGhpcy5pc1NhdmVkQ29udGFjdERpYWxsZWQoKTtcbiAgLy8gICAvL2xldCBpc0NhbGxlcklkU2V0ID0gYXdhaXQgdGhpcy5pc0NhbGxlcklkU2V0KCk7XG4gIC8vICAgdGhpcy5pc1BheW1lbnREdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGF5bWVudER1ZScpID09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gIC8vICAgaWYgKHRoaXMuaXNQYXltZW50RHVlKSB7XG4gIC8vICAgICBzd2FsKCdXYXJuaW5nJywgJ1BsZWFzZSBub3RlIHRoYXQgeW91ciBwYXltZW50IGlzIGR1ZSwgVG8gY29udGludWUgb24geW91ciBzZXJ2aWNlcyBraW5kbHkgc3Vic2NyaWJlIHRvIHVzZSB1bmludGVycnVwdGVkIHNlcnZpY2VzLicpO1xuICAvLyAgICAgcmV0dXJuO1xuICAvLyAgIH1cbiAgLy8gICB0aGlzLmlzVHJpYWxQZXJpb2RPdmVyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RyaWFsT3ZlcicpID09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gIC8vICAgLy8gaWYgKCF0aGlzLmlzVHJpYWxQZXJpb2RPdmVyKSB7XG4gIC8vICAgICBpZiAodGhpcy5zYW5pdGl6ZWROdW0gPT0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aWxpb051bWJlcicpKSB7XG4gIC8vICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW4gbm90IGRpYWwgdGhpcyBudW1iZXInKTtcbiAgLy8gICAgICAgcmV0dXJuO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gYXdhaXQgdGhpcy5jaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gIC8vICAgICBpZiAoaGFzUGVybWlzc2lvbikge1xuICAvLyAgICAgICBpZiAodGhpcy5zZWxlY3RlZENhbGxlcklkKSB7XG4gIC8vICAgICAgICAgLy9jbGVhciBkaXNwbGF5TnVtIGlmIHZhbHVlIGlzIGJpbmRlZCBmcm9tIHByZXZpb3VzIGNhbGxcbiAgLy8gICAgICAgICB0aGlzLmNhbGxEYXRhLmRpc3BsYXlOdW0gPSAnJztcbiAgLy8gICAgICAgICAvLyBnZXQgbnVtYmVyIHRvIGJlIGRpYWxsZWQgZnJvbSBiYWNrZW5kXG4gIC8vICAgICAgICAgYXdhaXQgdGhpcy5nZXRUb051bWJlcih0aGlzLnNhbml0aXplZE51bSk7XG4gIC8vICAgICAgICAgaWYgKHRoaXMudGVybWluYXRlQ2FsbCkge1xuICAvLyAgICAgICAgICAgdGhpcy50ZXJtaW5hdGVDYWxsID0gZmFsc2U7XG4gIC8vICAgICAgICAgICByZXR1cm47XG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSB0aGlzLnNhbml0aXplZE51bTtcbiAgLy8gICAgICAgICB0aGlzLmNhbGxEYXRhLmlzSW5jb21pbmdDYWxsID0gZmFsc2U7XG4gIC8vICAgICAgICAgdGhpcy5jYWxsRGF0YS5kaWFsID0gdHJ1ZTtcbiAgLy8gICAgICAgICBpZiAoIXRoaXMuaXNTbWFydERpYWxDYWxsKSB7XG4gIC8vICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmZyb20gPSB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyO1xuICAvLyAgICAgICAgIH1cbiAgICAgICAgICBcbiAgLy8gICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAvLyAgICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEgPSB7XG4gIC8vICAgICAgICAgICAgICAgLi4udGhpcy5jYWxsRGF0YSxcbiAgLy8gICAgICAgICAgICAgICBwaG9uZTogdGhpcy5zYW5pdGl6ZWROdW0sXG4gIC8vICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAvLyAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXG4gIC8vICAgICAgICAgICAgICAgZnJvbTogdGhpcy5pc1NtYXJ0RGlhbENhbGwgPyB0aGlzLmNhbGxEYXRhLmZyb20gOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxuICAvLyAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gIC8vICAgICAgICAgICAgIH07XG5cbiAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coJ0luaXRpYXRpbmcgY2FsbCB3aXRoIGRhdGE6JywgdGhpcy5jYWxsRGF0YSk7XG4gIC8vICAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gIC8vICAgICAgICAgICAgIHRoaXMuY2FsbEluaXRpYXRlZC5lbWl0KHsgLi4udGhpcy5jYWxsRGF0YSB9KTtcbiAgLy8gICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgLy8gICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgLy8gICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ1NlbGVjdCBhIEMyQyBudW1iZXIgdG8gY2FsbCcpO1xuICAvLyAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAvLyAgICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlO1xuICAvLyAgICAgICAgIH0sIDMwMDApO1xuICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgICAvL3RoaXMuY2FsbGluZ09wZW5FdmVudC5lbWl0KHsgcGhvbmU6IHRoaXMuZGlhbGVkTnVtYmVyIH0pO1xuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgYXdhaXQgdGhpcy5hc2tGb3JNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAvLyAgICAgfVxuICAvLyAgICAgLy90aGlzLmNsZWFyQWxsRGlhbGVkKCk7XG4gIC8vICAgLy8gfSBlbHNlIHtcbiAgLy8gICAvLyAgIHN3YWwoJ0Vycm9yJywgJ1RyaWFsIHBlcmlvZCBpcyBvdmVyLiBQbGVhc2Ugc2V0dXAgcGF5bWVudCBtZXRob2QgdG8gY29udGludWUgc2VydmljZXMnKVxuICAvLyAgIC8vIH1cbiAgLy8gfVxuXG5cbiAgLy8gYXN5bmMgaW5pdGlhdGVDYWxsKCkge1xuICAvLyAgIHRyeXtcbiAgLy8gICAgIGlmICghdGhpcy5kaWFsZWROdW1iZXIgJiYgdGhpcy5sYXN0RGlhbGVkKSB7XG4gIC8vICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gdGhpcy5sYXN0RGlhbGVkLm51bWJlcjtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgY29uc3QgaXNJbnZhbGlkID0gYXdhaXQgdGhpcy5pc0ludmFsaWROdW1iZXIoKTtcbiAgLy8gICAgIGlmIChpc0ludmFsaWQpIHtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuICAvLyAgICAgdGhpcy5zYXZlTGFzdERpYWxlZCgpO1xuICAvLyAgICAgdGhpcy5pc1NhdmVkQ29udGFjdERpYWxsZWQoKTtcbiAgLy8gICAgIC8vbGV0IGlzQ2FsbGVySWRTZXQgPSBhd2FpdCB0aGlzLmlzQ2FsbGVySWRTZXQoKTtcblxuICAvLyAgICAgdGhpcy5pc1BheW1lbnREdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGF5bWVudER1ZScpID09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gIC8vICAgICBpZiAodGhpcy5pc1BheW1lbnREdWUpIHtcbiAgLy8gICAgICAgc3dhbCgnV2FybmluZycsICdQbGVhc2Ugbm90ZSB0aGF0IHlvdXIgcGF5bWVudCBpcyBkdWUsIFRvIGNvbnRpbnVlIG9uIHlvdXIgc2VydmljZXMga2luZGx5IHN1YnNjcmliZSB0byB1c2UgdW5pbnRlcnJ1cHRlZCBzZXJ2aWNlcy4nKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICB0aGlzLmlzVHJpYWxQZXJpb2RPdmVyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RyaWFsT3ZlcicpID09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gIC8vICAgICAvLyBpZiAoIXRoaXMuaXNUcmlhbFBlcmlvZE92ZXIpIHtcbiAgLy8gICAgICAgaWYgKHRoaXMuc2FuaXRpemVkTnVtID09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xuICAvLyAgICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW4gbm90IGRpYWwgdGhpcyBudW1iZXInKTtcbiAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICAgIH1cblxuICAvLyAgICAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gYXdhaXQgdGhpcy5jaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gIC8vICAgICAgIGlmIChoYXNQZXJtaXNzaW9uKSB7XG4gIC8vICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCkge1xuICAvLyAgICAgICAgICAgLy9jbGVhciBkaXNwbGF5TnVtIGlmIHZhbHVlIGlzIGJpbmRlZCBmcm9tIHByZXZpb3VzIGNhbGxcbiAgLy8gICAgICAgICAgIHRoaXMuY2FsbERhdGEuZGlzcGxheU51bSA9ICcnO1xuICAvLyAgICAgICAgICAgLy8gZ2V0IG51bWJlciB0byBiZSBkaWFsbGVkIGZyb20gYmFja2VuZFxuICAvLyAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUb051bWJlcih0aGlzLnNhbml0aXplZE51bSk7XG4gIC8vICAgICAgICAgICBpZiAodGhpcy50ZXJtaW5hdGVDYWxsKSB7XG4gIC8vICAgICAgICAgICAgIHRoaXMudGVybWluYXRlQ2FsbCA9IGZhbHNlO1xuICAvLyAgICAgICAgICAgICByZXR1cm47XG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gdGhpcy5zYW5pdGl6ZWROdW07XG4gIC8vICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmlzSW5jb21pbmdDYWxsID0gZmFsc2U7XG4gIC8vICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmRpYWwgPSB0cnVlO1xuICAvLyAgICAgICAgICAgaWYgKCF0aGlzLmlzU21hcnREaWFsQ2FsbCkge1xuICAvLyAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmZyb20gPSB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyO1xuICAvLyAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gIC8vICAgICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAvLyAgICAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcbiAgLy8gICAgICAgICAgICAgICAgIC4uLnRoaXMuY2FsbERhdGEsXG4gIC8vICAgICAgICAgICAgICAgICBwaG9uZTogdGhpcy5zYW5pdGl6ZWROdW0sXG4gIC8vICAgICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gIC8vICAgICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxuICAvLyAgICAgICAgICAgICAgICAgZnJvbTogdGhpcy5pc1NtYXJ0RGlhbENhbGwgPyB0aGlzLmNhbGxEYXRhLmZyb20gOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxuICAvLyAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgLy8gICAgICAgICAgICAgICB9O1xuXG4gIC8vICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0luaXRpYXRpbmcgY2FsbCB3aXRoIGRhdGE6JywgdGhpcy5jYWxsRGF0YSk7XG4gIC8vICAgICAgICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmNhbGxJbml0aWF0ZWQuZW1pdCh7IC4uLnRoaXMuY2FsbERhdGEgfSk7XG4gIC8vICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgLy8gICAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IHRydWU7XG4gIC8vICAgICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ1NlbGVjdCBhIEMyQyBudW1iZXIgdG8gY2FsbCcpO1xuICAvLyAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gIC8vICAgICAgICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSBmYWxzZTtcbiAgLy8gICAgICAgICAgIH0sIDMwMDApO1xuICAvLyAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgICAvL3RoaXMuY2FsbGluZ09wZW5FdmVudC5lbWl0KHsgcGhvbmU6IHRoaXMuZGlhbGVkTnVtYmVyIH0pO1xuICAvLyAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgIGF3YWl0IHRoaXMuYXNrRm9yTWljcm9waG9uZVBlcm1pc3Npb24oKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgICAvL3RoaXMuY2xlYXJBbGxEaWFsZWQoKTtcbiAgLy8gICAgIC8vIH0gZWxzZSB7XG4gIC8vICAgICAvLyAgIHN3YWwoJ0Vycm9yJywgJ1RyaWFsIHBlcmlvZCBpcyBvdmVyLiBQbGVhc2Ugc2V0dXAgcGF5bWVudCBtZXRob2QgdG8gY29udGludWUgc2VydmljZXMnKVxuICAvLyAgICAgLy8gfVxuICAvLyAgIH1jYXRjaChlKXtcbiAgLy8gICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGluaXRpYXRlQ2FsbDonLCBlKTtcblxuICAvLyAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdGYWlsZWQgdG8gaW5pdGlhdGUgY2FsbC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcblxuICAvLyAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICB9XG4gIC8vIH1cblxuXG4gIGFzeW5jIGluaXRpYXRlQ2FsbCgpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmRpYWxlZE51bWJlciAmJiB0aGlzLmxhc3REaWFsZWQpIHtcbiAgICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSB0aGlzLmxhc3REaWFsZWQubnVtYmVyO1xuICAgICAgfVxuICBcbiAgICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKCk7XG4gICAgICBpZiAoaXNJbnZhbGlkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMuc2F2ZUxhc3REaWFsZWQoKTtcbiAgICAgIHRoaXMuaXNTYXZlZENvbnRhY3REaWFsbGVkKCk7XG4gIFxuICAgICAgdGhpcy5pc1BheW1lbnREdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGF5bWVudER1ZScpID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAgICAgaWYgKHRoaXMuaXNQYXltZW50RHVlKSB7XG4gICAgICAgIC8vIHN3YWwoJ1dhcm5pbmcnLCAnUGxlYXNlIG5vdGUgdGhhdCB5b3VyIHBheW1lbnQgaXMgZHVlLCBUbyBjb250aW51ZSBvbiB5b3VyIHNlcnZpY2VzIGtpbmRseSBzdWJzY3JpYmUgdG8gdXNlIHVuaW50ZXJydXB0ZWQgc2VydmljZXMuJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgXG4gICAgICB0aGlzLmlzVHJpYWxQZXJpb2RPdmVyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RyaWFsT3ZlcicpID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5zYW5pdGl6ZWROdW0gPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xuICAgICAgICAvLyBzd2FsKCdFcnJvcicsICdZb3UgY2FuIG5vdCBkaWFsIHRoaXMgbnVtYmVyJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgXG4gICAgICAvLyBjb25zdCBoYXNQZXJtaXNzaW9uID0gYXdhaXQgdGhpcy5jaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gICAgICAvLyBpZiAoIWhhc1Blcm1pc3Npb24pIHtcbiAgICAgIC8vICAgYXdhaXQgdGhpcy5hc2tGb3JNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAgICAgLy8gICByZXR1cm4gZmFsc2U7XG4gICAgICAvLyB9XG4gIFxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2FsbGVySWQpIHtcbiAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnU2VsZWN0IGEgQzJDIG51bWJlciB0byBjYWxsJyk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSBmYWxzZTtcbiAgICAgICAgfSwgMzAwMCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgXG4gICAgICAvLyBDbGVhciBkaXNwbGF5TnVtIGlmIHZhbHVlIGlzIGJvdW5kIGZyb20gcHJldmlvdXMgY2FsbFxuICAgICAgdGhpcy5jYWxsRGF0YS5kaXNwbGF5TnVtID0gJyc7XG4gICAgICBcbiAgICAgIC8vIEdldCBudW1iZXIgdG8gYmUgZGlhbGVkIGZyb20gYmFja2VuZFxuICAgICAgLy8gYXdhaXQgdGhpcy5nZXRUb051bWJlcih0aGlzLnNhbml0aXplZE51bSk7XG4gICAgICBpZiAodGhpcy50ZXJtaW5hdGVDYWxsKSB7XG4gICAgICAgIHRoaXMudGVybWluYXRlQ2FsbCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIFxuICAgICAgLy8gVXBkYXRlIGNhbGwgZGF0YSBpbiBhIHNpbmdsZSBvcGVyYXRpb25cbiAgICAgIHRoaXMuY2FsbERhdGEgPSB7XG4gICAgICAgIC4uLnRoaXMuY2FsbERhdGEsXG4gICAgICAgIHBob25lOiB0aGlzLnNhbml0aXplZE51bSxcbiAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgICAgICBkaWFsOiB0cnVlLFxuICAgICAgICBmcm9tOiB0aGlzLmlzU21hcnREaWFsQ2FsbCA/IHRoaXMuY2FsbERhdGEuZnJvbSA6IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZC5udW1iZXIsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICB9O1xuICBcbiAgICAgIGNvbnNvbGUubG9nKCdJbml0aWF0aW5nIGNhbGwgd2l0aCBkYXRhOicsIHRoaXMuY2FsbERhdGEpO1xuICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2FsbEluaXRpYXRlZC5lbWl0KHsgLi4udGhpcy5jYWxsRGF0YSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICBcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBpbml0aWF0ZUNhbGw6JywgZSk7XG4gICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ZhaWxlZCB0byBpbml0aWF0ZSBjYWxsLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXNJbnZhbGlkTnVtYmVyKCkge1xuICAgIHRyeSB7XG4gICAgICBpZih0aGlzLnNhbml0aXplZE51bSA9PSAnJyl7XG4gICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWxpZE51bWJlclBhdHRlcm4gPSAvXlsrXFxkXFxzKCktXSokLzsgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIHZhbGlkIGNoYXJhY3RlcnNcbiAgICAgIGNvbnN0IHBob25lTnVtYmVyID0gdGhpcy5zYW5pdGl6ZWROdW07XG4gICAgICBpZiAoIXZhbGlkTnVtYmVyUGF0dGVybi50ZXN0KHBob25lTnVtYmVyKSkge1xuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gUmV0dXJuIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIG1lYW5pbmcgdGhlIG51bWJlciBpcyBpbnZhbGlkXG4gICAgfVxuICB9XG4gIFxuICAvLyBzYXZlTGFzdERpYWxlZCgpIHtcbiAgLy8gICBjb25zdCBjb250YWN0ID0gdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0LmZpbmQoYyA9PiBjLm51bWJlcnNMaXN0LnNvbWUobiA9PiBuLm51bWJlciA9PT0gdGhpcy5kaWFsZWROdW1iZXIpKTtcbiAgLy8gICBpZiAoY29udGFjdCkge1xuICAvLyAgICAgdGhpcy5sYXN0RGlhbGVkID0ge1xuICAvLyAgICAgICBuYW1lOiBjb250YWN0Lm5hbWUsXG4gIC8vICAgICAgIGltYWdlOiBjb250YWN0LmltYWdlLFxuICAvLyAgICAgICBudW1iZXI6IHRoaXMuZGlhbGVkTnVtYmVyXG4gIC8vICAgICB9O1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICBpZih0aGlzLmRpYWxlZE51bWJlcil7XG4gIC8vICAgICAgIHRoaXMubGFzdERpYWxlZCA9IHsgbnVtYmVyOiB0aGlzLmRpYWxlZE51bWJlciB9O1xuICAvLyAgICAgfVxuICAgICAgXG4gIC8vICAgfVxuICAvLyB9XG4gIGlzU2F2ZWRDb250YWN0RGlhbGxlZCgpe1xuICAgIGxldCBwaG9uZU51bSA9IHRoaXMuc2FuaXRpemVkTnVtLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIGxldCBjb250YWN0ID0gIHRoaXMuY29udGFjdExpc3QuZmlsdGVyKGNvbnRhY3QgPT4ge1xuICAgICAgLy8gcmV0dXJuIGNvbnRhY3QubnVtYmVyc0xpc3Quc29tZShudW0gPT4gbnVtLm51bWJlciA9PT0gcGhvbmVOdW0pXG4gICAgfSk7XG4gICAgaWYoY29udGFjdC5sZW5ndGgpe1xuICAgICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gYCR7Y29udGFjdFswXS5maXJzdE5hbWV9ICR7Y29udGFjdFswXS5taWRkbGVOYW1lfSAke2NvbnRhY3RbMF0ubGFzdE5hbWV9YC50b0xvd2VyQ2FzZSgpO1xuICAgICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0WzBdLmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJztcbiAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSB0aGlzLnNhbml0aXplZE51bTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzaG93RGlhbEFsZXJ0KG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHRoaXMuZGlhbEFsZXJ0ID0ge1xuICAgICAgbXNnOiBtZXNzYWdlLFxuICAgICAgc2hvdzogdHJ1ZVxuICAgIH07XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRpYWxBbGVydC5zaG93ID0gZmFsc2U7XG4gICAgfSwgMzAwMCk7XG4gIH1cbiAgYXN5bmMgaXNDYWxsZXJJZFNldCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGtuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpO1xuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLmV4dFNlcnZpY2UuZmV0Y2hDYWxsZXJJZCh0a24gfHwgJycpLnRvUHJvbWlzZSgpO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0cmlhbE92ZXInLCByZXMudHJpYWxPdmVyKTtcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzVHJpYWxPdmVyLm5leHQocmVzLnRyaWFsT3Zlcik7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwYXltZW50RHVlJywgcmVzLnBheW1lbnREdWUpO1xuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNQYXltZW50RHVlLm5leHQocmVzLnBheW1lbnREdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlcy5jYWxsZXJpZCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FsbGVySUQnLCByZXMuY2FsbGVyaWQpO1xuXG4gICAgICAgIHRoaXMuZXh0U2VydmljZS5jaGFuZ2VNZXNzYWdlKHJlcy5jYWxsZXJpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FsbGVySUQnLCAnTm90IHNldCcpO1xuICAgICAgICB0aGlzLmV4dFNlcnZpY2UuY2hhbmdlTWVzc2FnZSgnTm90IHNldCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYWxsZXJJRCcpICE9PSAnTm90IHNldCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBhc3luYyBjaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2godHJhY2sgPT4gdHJhY2suc3RvcCgpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiYgZXJyb3IubmFtZSA9PT0gJ05vdEFsbG93ZWRFcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBhc3luYyBhc2tGb3JNaWNyb3Bob25lUGVybWlzc2lvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyBhdWRpbzogdHJ1ZSB9KTtcbiAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKHRyYWNrID0+IHRyYWNrLnN0b3AoKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1VzZXIgZGVuaWVkIG1pY3JvcGhvbmUgcGVybWlzc2lvbjonLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIC8vIGJlbG93IGZ1bmN0aW9uIGlzIHRvIGdldCB0aGUgY291bnRyeSBjb2RlIHdpdGggbnVtYmVyIGZyb20gc2VydmVyIFxuICBhc3luYyBnZXRUb051bWJlcihkaWFsZWROdW1iZXI6IHN0cmluZykge1xuICAgIFxuICAgICAgaWYgKGRpYWxlZE51bWJlclswXSAhPT0gJysnKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgY2FzZSB3aGVuIHVzZXIgZ2VvbG9jYXRpb24gZGlhbCBjb2RlIGlzIG9uXG4gICAgICAgIGxldCBpcEFkZHJlc3M6IGFueSA9IGF3YWl0IHRoaXMuaXBTZXJ2aWNlLmdldElwQWRkcmVzc0luZm8oKS50b1Byb21pc2UoKTtcbiAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLnR3aWxpb1NlcnZpY2UuZ2V0VG9OdW1iZXIoZGlhbGVkTnVtYmVyLGlwQWRkcmVzcy5hZGRyZXNzLmNvdW50cnlDb2RlKS50b1Byb21pc2UoKTtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgICAgdGhpcy50b2FzdFRpbWVvdXQgPSByZXMudGltZUludGVydmFsICogMTAwMDtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNob3dOdW1iZXJUb2FzdChyZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gIH1cbiAgaXNBbGVydEVuYWJsZSgpIHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2lzQWxlcnRFbmFibGUnKTtcbiAgfVxuICBhc3luYyBzaG93TnVtYmVyVG9hc3QoZGF0YTogYW55KSB7XG4gICAgY29uc3QgaXNBbGVydE9uID0gKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdpc0NvdW50cnlDb2RlVG9hc3RPbicpKTtcbiAgICBpZiAoaXNBbGVydE9uID09ICd0cnVlJykge1xuICAgICAgdGhpcy5jYWxsTnVtYmVyVG9hc3Quc2hvdyA9IHRydWU7XG4gICAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5udW1iZXIgPSBkYXRhLnRvTnVtYmVyO1xuICAgICAgdGhpcy5jYWxsTnVtYmVyVG9hc3QuZGlzcGxheU51bSA9IGRhdGEuZGlzcGxheU51bWJlcjtcbiAgICB9XG4gICAgXG4gICAgXG4gICAgdGhpcy5jYWxsRGF0YS5kaXNwbGF5TnVtID0gZGF0YS5kaXNwbGF5TnVtYmVyO1xuICAgIC8vdGhpcy5jYWxsRGF0YS5waG9uZSA9IGRhdGEudG9OdW1iZXI7XG4gICAgYXdhaXQgdGhpcy5kZWxheSh0aGlzLnRvYXN0VGltZW91dCk7XG4gICAgdGhpcy5kaWFsZWROdW1iZXIgPSBkYXRhLnRvTnVtYmVyO1xuICAgIHRoaXMuc2FuaXRpemVkTnVtID0gZGF0YS50b051bWJlcjtcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gZmFsc2U7XG4gICAgdGhpcy5jYWxsTnVtYmVyVG9hc3QubnVtYmVyID0gJyc7XG4gICAgdGhpcy5jYWxsTnVtYmVyVG9hc3QuZGlzcGxheU51bSA9ICcnO1xuICB9XG4gIGRlbGF5KG1zOiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gIH1cbiAgaXNNaW5pbWlzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgb25NaW5pbWlzZShpc01pbmltaXNlZDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNNaW5pbWlzZWQgPSBpc01pbmltaXNlZDtcbiAgICB0aGlzLm1pbmltaXNlRXZlbnQuZW1pdChpc01pbmltaXNlZCk7XG4gIH1cbiAgaGFuZGxlTnVtYmVyUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YSB8fCAod2luZG93IGFzIGFueSkuY2xpcGJvYXJkRGF0YTtcbiAgICBjb25zdCBwYXN0ZWREYXRhID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XG5cbiAgICAvLyBMb2cgdGhlIHBhc3RlZCBjb250ZW50IHRvIHRoZSBjb25zb2xlXG4gICAgaWYocGFzdGVkRGF0YSl7XG4gICAgICB0aGlzLmRpYWxlZE51bWJlciA9IHBhc3RlZERhdGE7XG4gICAgICB0aGlzLnNhbml0aXplZE51bSA9IHBhc3RlZERhdGE7XG4gICAgfVxuICAgIFxuICB9XG4gIG9uRW50ZXIobnVtOnN0cmluZykge1xuICAgIGNvbnNvbGUubG9nKG51bSwgJ251bWJlciBmbicpXG4gICAgdGhpcy5kaWFsZWROdW1iZXIgPSB0aGlzLmRpYWxlZE51bWJlciArbnVtO1xuICAgIHRoaXMuc2FuaXRpemVkTnVtID0gdGhpcy5kaWFsZWROdW1iZXI7XG4gICAgdGhpcy5zaG93SW5wdXRDbGVhckJ0biA9IHRydWU7XG4gICAgdGhpcy5udW1iZXJEaWFsZWQuZW1pdCh0aGlzLmRpYWxlZE51bWJlcik7XG4gIH1cbiAgXG4gIGdldFVzZXJDYWxsU2V0dGluZygpIHtcbiAgICBjb25zdCB0a24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyk7XG4gICAgdGhpcy5leHRTZXJ2aWNlLmZldGNoQ2FsbGVySWQodGtuIHx8ICcnKS5zdWJzY3JpYmUoKHJlc3A6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3Auc3RhdHVzID09IDIwMCkge1xuICAgICAgICAvL3RoaXMuY2FsbFByZWZlcm5jZSA9IHJlc3AudXNlclNldHRpbmc7XG4gICAgICAgIHRoaXMuY2FsbFByZWZlcmVuY2UgPSByZXNwLmNhbGxlcmlkO1xuICAgICAgICB0aGlzLmdldENhbGxlcklkTGlzdCgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgb25EZWRpY2F0ZWROdW1TZWxlY3QoaWQ6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IGlkO1xuICAgIHRoaXMuaXNDYWxsZXJJZEhpZGRlbiA9IHRydWU7XG4gICAgdGhpcy5leHRTZXJ2aWNlLnNldENhbGxlcklkKGlkKTtcbiAgfVxuICBjYW5jZWxEaWFsTnVtYmVyKCkge1xuICAgIHRoaXMudGVybWluYXRlQ2FsbCA9IHRydWU7XG4gICAgdGhpcy5jYWxsTnVtYmVyVG9hc3Quc2hvdyA9IGZhbHNlO1xuICB9XG5cbiAgaGFuZGxlRGl2S2V5ZG93bihldjphbnkpe1xuICAgIGlmKHRoaXMuZGlhbGVkTnVtYmVyLmxlbmd0aCA9PSAwKXtcbiAgICAgIHRoaXMuZGlhbElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIGlmIChldi5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBkaWFscGFkIGlzIG9wZW5cbiAgICAgIGlmICghdGhpcy5pc0RpYWxwYWRIaWRkZW4pIHtcbiAgICAgICAgaWYodGhpcy5kaWFsZWROdW1iZXIubGVuZ3RoID4gMiAmJiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQpe1xuICAgICAgICAgIHRoaXMuaW5pdGlhdGVDYWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoIXRoaXMuc2VsZWN0ZWRDYWxsZXJJZCl7XG4gICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IHRydWU7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2U7XG4gICAgICAgICAgfSwgMTAwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG9uQ2FsbEJ0bk1vdXNlRW50ZXIoZXY6IGFueSkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENhbGxlcklkIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ2Fsd2F5c0FzaycpIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpKSB7XG4gICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuICBvbkNhbGxCdG5Nb3VzZUxlYXZlKGV2OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDYWxsZXJJZCB8fCAodGhpcy5zZWxlY3RlZENhbGxlcklkID09ICdhbHdheXNBc2snKSB8fCAodGhpcy5zZWxlY3RlZENhbGxlcklkID09ICdzbWFydERpYWxpbmcnKSkge1xuICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBhY2NlcHROZXdJbmNvbWluZ0NhbGwoY2FsbDogQ2FsbCkge1xuICAgIC8vZmlyc3QgY3V0IHRoZSBjdXJyZW50IGNhbGxcbiAgICAvL3RoaXMuY2FsbERhdGEgPSBjYWxsO1xuICAgIHRoaXMubmV3SW5jb21pbmdDYWxsRGF0YSA9IGNhbGw7XG4gIH1cbiAgcmVqZWN0TmV3SW5jb21pbmdDYWxsKGNhbGw6IENhbGwpIHtcbiAgICBjYWxsLnJlamVjdCgpO1xuICAgIHRoaXMubmV3SW5jb21pbmdDYWxscyA9IHRoaXMubmV3SW5jb21pbmdDYWxscy5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5wYXJhbWV0ZXJzWydDYWxsU2lkJ10gIT09IGNhbGwucGFyYW1ldGVyc1snQ2FsbFNpZCddKTtcbiAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0ID0gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5wYXJhbWV0ZXJzWydDYWxsU2lkJ10gIT09IGNhbGwucGFyYW1ldGVyc1snQ2FsbFNpZCddKTtcbiAgfVxuICBuZXdJbmNvbWluZ0NhbGxJbml0aWF0ZWQoKSB7XG4gICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICB0aGlzLm5ld0luY29taW5nQ2FsbHMgPSBbXTtcbiAgICB0aGlzLmluY29taW5nQ2FsbEluaXRpYXRlZC5lbWl0KCk7XG4gIH1cbiAgaW5jb21pbmdDYWxsc05ld0luZm8oZGF0YTphbnkpe1xuICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSBkYXRhO1xuICAgIHRoaXMuaW5jb21pbmdDYWxsc05ld0luZm9FdmVudC5lbWl0KGRhdGEpO1xuICB9XG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZygnQ2xlYW5pbmcgdXAgQzJjRGlhbHBhZENvbXBvbmVudCcpO1xuICAgICAgXG4gICAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFsbCBzdWJzY3JpcHRpb25zXG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbmQgYW55IGFjdGl2ZSBjYWxsXG4gICAgICBpZiAodGhpcy5pc0NhbGxJblByb2dyZXNzKSB7XG4gICAgICAgIHRoaXMuZW5kQ2FsbCgpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDbGVhciBhbnkgdGltZW91dHMgb3IgaW50ZXJ2YWxzIGlmIHRoZXkgZXhpc3RcbiAgICAgIGlmICh0aGlzLnRvYXN0VGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50b2FzdFRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnQzJjRGlhbHBhZENvbXBvbmVudCBjbGVhbnVwIGNvbXBsZXRlJyk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGNvbXBvbmVudCBjbGVhbnVwOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXY+XHJcbiAgbGliIGFsbCBjYWxsZWRcclxuPC9kaXY+XHJcbjxkaXYgaWQ9XCJkcmFncGFyZW50MVwiIFtuZ1N0eWxlXT1cInsnZGlzcGxheSc6aXNEaWFscGFkSGlkZGVuID8gJ25vbmUnOiAnYmxvY2snfVwiPlxyXG4gIDwhLS0gPGFwcC1jYWxsLXByb2dyZXNzICpuZ0lmPVwiaXNDYWxsSW5Qcm9ncmVzc1wiXHJcbiAgIChlbmRDYWxsRXZlbnQpPVwiZW5kQ2FsbCgpXCJcclxuICAgKG1pbmltaXNlRXZlbnQpID0gXCJvbk1pbmltaXNlKCRldmVudClcIlxyXG4gICAoaW5jb21pbmdDYWxsSW5pdGlhdGVkKT1cIm5ld0luY29taW5nQ2FsbEluaXRpYXRlZCgpXCJcclxuICAgW25ld0luY29taW5nQ2FsbERhdGFdPVwibmV3SW5jb21pbmdDYWxsRGF0YVwiXHJcbiAgIFtuZXdJbmNvbWluZ0NhbGxzTGlzdF09XCJpbmNvbWluZ0NhbGxzTGlzdFwiXHJcbiAgIChpbmNvbWluZ0NhbGxzTmV3SW5mbyk9XCJpbmNvbWluZ0NhbGxzTmV3SW5mbygkZXZlbnQpXCJcclxuICAgIFtjYWxsRGF0YV09XCJjYWxsRGF0YVwiPjwvYXBwLWNhbGwtcHJvZ3Jlc3M+IC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJkaWFscGFkLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cInsnbWluaS1kaWFscGFkJzogaXNNaW5pbWlzZWR9XCIgdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwiaGFuZGxlRGl2S2V5ZG93bigkZXZlbnQpXCI+XHJcbiAgICA8ZGl2IGlkPVwidG9wUGFuZWxcIiBbbmdTdHlsZV09XCJ7J2hlaWdodCc6IGNhbGxlcklkTGlzdC5sZW5ndGggPyAnNDAlJyA6ICczOSUnfVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbHBhZC1hbGVydHNcIiAqbmdJZj1cImRpYWxBbGVydC5zaG93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXNlbGVjdGlvbi1hbGVydFwiPlxyXG4gICAgICAgICAgPCEtLSA8cCBjbGFzcz1cIm1iLTBcIj5TZWxlY3QgQzJDIG51bWJlciB0byBjYWxsPC9wPiAtLT5cclxuICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7ZGlhbEFsZXJ0Lm1zZ319PC9wPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS10aW1lc1wiIChjbGljayk9XCJzaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxwYWQtYWxlcnRzXCIgKm5nSWY9XCJjYWxsTnVtYmVyVG9hc3Quc2hvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsYm94LXBvcDEgYWxlcnQgZmFkZSBzaG93XCIgW25nQ2xhc3NdPVwiY2FsbE51bWJlclRvYXN0LnR5cGVcIiByb2xlPVwiYWxlcnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xIG15LWF1dG8gdGV4dC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgWW91J3IgY2FsbGluZyA8c3Ryb25nPnt7Y2FsbE51bWJlclRvYXN0LmRpc3BsYXlOdW19fTwvc3Ryb25nPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kaXNjIHAtMCBweC0xXCIgKGNsaWNrKT1cImNhbmNlbERpYWxOdW1iZXIoKVwiPkNhbmNlbCBDYWxsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1zdWNjZXNzIGJ0bi1kaXNjIHAtMCBweC0yXCI+Q29udGludWU8L2J1dHRvbj4gLS0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICBcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDAgMThweFwiIChwYXN0ZSk9XCJoYW5kbGVOdW1iZXJQYXN0ZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtdC0yXCI+XHJcbiAgICAgICAgICA8cD48L3A+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZGlhbC1jbG9zZS1idG5cIiAoY2xpY2spPVwiaGlkZURpYWxwYWQoKVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNHB4XCIgZmlsbD1cIiNmZmZmZmZcIj48cGF0aCBkPVwibTI1Ni0yMDAtNTYtNTYgMjI0LTIyNC0yMjQtMjI0IDU2LTU2IDIyNCAyMjQgMjI0LTIyNCA1NiA1Ni0yMjQgMjI0IDIyNCAyMjQtNTYgNTYtMjI0LTIyNC0yMjQgMjI0WlwiLz48L3N2Zz5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtYm94XCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiAjZGlhbElucHV0IHBsYWNlaG9sZGVyPVwiRW50ZXIgYSBuYW1lIG9yIG51bWJlclwiIHRhYmluZGV4PVwiMVwiIFsobmdNb2RlbCldPVwiZGlhbGVkTnVtYmVyXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25EaWFsSW5wdXRDaGFuZ2UoJGV2ZW50KVwiLz5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiXCIgaWQ9XCJpbnB1dC1jbGVhci1idG5cIiAoY2xpY2spPVwiY2xlYXJJbnB1dCgpXCIgKm5nSWY9XCJzaG93SW5wdXRDbGVhckJ0blwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTBweFwiIGhlaWdodD1cIjMwcHhcIiB2aWV3Qm94PVwiMCAxMCA0MCA2MFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2ZXJzaW9uPVwiMS4xXCIgYmFzZVByb2ZpbGU9XCJmdWxsXCIgZW5hYmxlLWJhY2tncm91bmQ9XCJuZXcgMCAwIDc2LjAwIDc2LjAwXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cclxuICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiIzVkNjA2MVwiIGZpbGwtb3BhY2l0eT1cIjFcIiBzdHJva2Utd2lkdGg9XCIwLjJcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGQ9XCJNIDQ3LjUyODIsNDIuOTQ5N0wgNDIuNTc4NCwzOEwgNDcuNTI4MiwzMy4wNTAyTCA0NC45NDk3LDMwLjQ3MThMIDQwLDM1LjQyMTZMIDM1LjA1MDIsMzAuNDcxOEwgMzIuNDcxOCwzMy4wNTAyTCAzNy40MjE2LDM4TCAzMi40NzE4LDQyLjk0OTdMIDM1LjA1MDIsNDUuNTI4MkwgNDAsNDAuNTc4NEwgNDQuOTQ5Nyw0NS41MjgyTCA0Ny41MjgyLDQyLjk0OTcgWiBNIDE4LjAxNDcsNDEuNTM1NUwgMjYuOTY0Niw1MC40ODU0QyAyOC4wNjgzLDUxLjU4OSAyOSw1MiAzMSw1MkwgNTIsNTJDIDU0Ljc2MTQsNTIgNTcsNDkuNzYxNCA1Nyw0N0wgNTcsMjlDIDU3LDI2LjIzODYgNTQuNzYxNCwyNCA1MiwyNEwgMzEsMjRDIDI5LDI0IDI4LjA2ODMsMjQuNDExMyAyNi45NjQ2LDI1LjUxNDlMIDE4LjAxNDcsMzQuNDY0NUMgMTYuMDYyMSwzNi40MTcxIDE2LjA2MjEsMzkuNTgyOSAxOC4wMTQ3LDQxLjUzNTUgWiBNIDMxLDQ5QyAzMCw0OSAyOS42MDQ4LDQ4Ljg4MjggMjkuMDg2LDQ4LjM2NDFMIDIwLjEzNjEsMzkuNDE0MkMgMTkuMzU1LDM4LjYzMzIgMTkuMzU1LDM3LjM2NjkgMjAuMTM2MSwzNi41ODU4TCAyOS4wODYsMjcuNjM2MkMgMjkuNjA0OCwyNy4xMTc1IDMwLDI3IDMxLDI3LjAwMDFMIDUyLDI3LjAwMDFDIDUzLjEwNDYsMjcuMDAwMSA1NCwyNy44OTU1IDU0LDI5LjAwMDFMIDU0LDQ3LjAwMDFDIDU0LDQ4LjEwNDYgNTMuMTA0Niw0OS4wMDAxIDUyLDQ5LjAwMDFMIDMxLDQ5IFogXCIvPlxyXG4gICAgICAgICAgICA8L3N2Zz4gICAgICAgIFxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1pbmZvLWljb25cIiBwbGFjZW1lbnQ9XCJib3R0b20tcmlnaHRcIiB0b29sdGlwQ2xhc3M9XCJpbnB1dC10b29sdGlwXCIgbmdiVG9vbHRpcD1cIkZvciBleHRlbnNpb24gZGlhbGluZywgdXNlIGZvcm1hdHMgbGlrZSArMTIzNDU2Nzg5MTAgeDEyMywrMTIzNDU2Nzg5MTAgZXh0LjEyMywgKzEyMzQ1Njc4OTEwLDEyM1wiPjxpIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGVcIj48L2k+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJndWlkZVwiICpuZ0lmPVwiY2FsbGVySWRMaXN0Lmxlbmd0aCAmJiAhKGRpYWxlZE51bWJlci5sZW5ndGggPiAyKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJndWlkZXRleHRcIj5QbGVhc2UgZW50ZXIgYSBudW1iZXIgb3Igc2VsZWN0IGEgc2F2ZWQgY29udGFjdDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJpbnB1dC1lcnJvclwiICpuZ0lmPVwiZGlhbEFsZXJ0LnNob3dcIj5cclxuICAgICAgICAgIDxzcGFuPnt7ZGlhbEFsZXJ0Lm1zZ319PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtY2FyZFwiICpuZ0Zvcj1cImxldCBjb250YWN0IG9mIGZpbHRlcmVkQ29udGFjdExpc3RcIiAoY2xpY2spPVwib25Db250YWN0U2VsZWN0KGNvbnRhY3QpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWltZ1wiPlxyXG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjb250YWN0LmltYWdlXCIgYWx0PVwidXNlciBpbWFnZVwiIGxvYWRpbmc9XCJsYXp5XCIgKm5nSWY9XCJjb250YWN0LmltYWdlIGVsc2UgYWxwaGFOYW1lXCIvPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYWxwaGFOYW1lPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb250YWN0LWFscGhhLWltZ1wiPnt7Z2V0Rmlyc3RMZXR0ZXIoY29udGFjdC5maXJzdE5hbWUpfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWRldGFpbHNcIj5cclxuICAgICAgICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDRweFwiIGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tnZXRGdWxsTmFtZShjb250YWN0KSB9fTwvcD5cclxuICAgICAgICAgICAgICA8cD57e2NvbnRhY3QubnVtYmVyc0xpc3RbMF0ubnVtYmVyfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid2F2ZS1jb250YWluZXJcIj5cclxuICAgICAgICA8c3ZnXHJcbiAgICAgICAgICBjbGFzcz1cIndhdmVzXCJcclxuICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcclxuICAgICAgICAgIHZpZXdCb3g9XCIwIDI0IDE1MCAyOFwiXHJcbiAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiXHJcbiAgICAgICAgICBzaGFwZS1yZW5kZXJpbmc9XCJhdXRvXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBpZD1cImdlbnRsZS13YXZlXCJcclxuICAgICAgICAgICAgICBkPVwiTS0xNjAgNDRjMzAgMCA1OC0xOCA4OC0xOHMgNTggMTggODggMTggNTgtMTggODgtMTggNTggMTggODggMTggdjQ0aC0zNTJ6XCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgIDxnIGNsYXNzPVwicGFyYWxsYXhcIj5cclxuICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIlxyXG4gICAgICAgICAgICAgIHg9XCI0OFwiXHJcbiAgICAgICAgICAgICAgeT1cIjBcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNylcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiXHJcbiAgICAgICAgICAgICAgeD1cIjQ4XCJcclxuICAgICAgICAgICAgICB5PVwiM1wiXHJcbiAgICAgICAgICAgICAgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC41KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwhLS0gPHVzZVxyXG4gICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIlxyXG4gICAgICAgICAgICAgIHg9XCI0OFwiXHJcbiAgICAgICAgICAgICAgeT1cIjVcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuMylcIlxyXG4gICAgICAgICAgICAvPiAtLT5cclxuICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjdcIiBmaWxsPVwiI2ZmZlwiIC8+XHJcbiAgICAgICAgICA8L2c+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRhaW5lclwiICpuZ0lmPVwiIWlzTWluaW1pc2VkXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJkaWFsLWJ0blwiICpuZ0Zvcj1cImxldCBrZXkgb2Yga2V5cGFkVmFsO2xldCBpID0gaW5kZXhcIlxyXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbkVudGVyKGtleS5udW0pXCIgKGNsaWNrKT1cImFkZE51bWJlcihrZXkubnVtKVwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IGtleS50ZXh0ID09PSAnKycgPyAnM3B4JyA6ICcwJ31cIlxyXG4gICAgICAgW3RhYmluZGV4XT1cImRpYWxlZE51bWJlci5sZW5ndGggPyAnMCc6IGkrMlwiIGxvbmdQcmVzcyAobG9uZ1ByZXNzKT1cImFkZE51bWJlcihrZXkudGV4dClcIiBzaG9ydFByZXNzIChzaG9ydFByZXNzKT1cImFkZE51bWJlcihrZXkubnVtKVwiPlxyXG4gICAgICAgIHt7a2V5Lm51bX19IFxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwia2V5Lm51bSA9PSAxO2Vsc2Ugb3RoZXJUaGFuT25lXCIgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHZvaWNlbWFpbFwiPlxyXG4gICAgICAgICAgdm9pY2VtYWlsXHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjb3RoZXJUaGFuT25lPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4tYWxiaGFiZXRzXCIgW25nQ2xhc3NdPVwieydwbHVzU2lnbic6IGtleS50ZXh0ID09PSAnKyd9XCI+e3trZXkudGV4dCA/IGtleS50ZXh0IDogJyZuYnNwOyd9fTwvc3Bhbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGwtYnRuLWNvbnRhaW5lclwiICpuZ0lmPVwiIWlzTWluaW1pc2VkXCIgKG1vdXNlZW50ZXIpPVwib25DYWxsQnRuTW91c2VFbnRlcigkZXZlbnQpXCIgKG1vdXNlbGVhdmUpPVwib25DYWxsQnRuTW91c2VMZWF2ZSgkZXZlbnQpXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWJ0blwiIChjbGljayk9XCJpbml0aWF0ZUNhbGwoKVwiIFt0YWJpbmRleF09XCJkaWFsZWROdW1iZXIubGVuZ3RoID8gJzInOiAnMTUnXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7J3BvaW50ZXItZXZlbnRzJzogZGlhbGVkTnVtYmVyLmxlbmd0aCAmJiBzZWxlY3RlZENhbGxlcklkID8gJ2F1dG8nIDogJ25vbmUnLCAnb3BhY2l0eSc6IGRpYWxlZE51bWJlci5sZW5ndGggJiYgc2VsZWN0ZWRDYWxsZXJJZCA/ICcxJyA6ICcwLjUnfVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+XHJcbiAgICAgICAgICBjYWxsXHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cImNhbGxlcklkTGlzdC5sZW5ndGggJiYgIWlzTWluaW1pc2VkXCIgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2hvd25DYWxsZXJJZFwiICpuZ0lmPVwic2VsZWN0ZWRDYWxsZXJJZDsgZWxzZSBhc2tCbG9ja1wiIChjbGljayk9XCJ0b2dnbGVDYWxsZXJJZERpdigpXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIidmaSBmaS0nICsgc2VsZWN0ZWRDYWxsZXJJZD8uaXNvQ29kZT8udG9Mb3dlckNhc2UoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgIHt7c2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjYXNrQmxvY2s+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNob3duQ2FsbGVySWRcIiAgKGNsaWNrKT1cInRvZ2dsZUNhbGxlcklkRGl2KClcIiBbbmdDbGFzc109XCJ7ICd0aWx0LXNoYWtpbmcnOiBzaGFrZURlZGljYXRlZEJ0biB9XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMFwiPlNlbGVjdCBDMkMgbnVtYmVyPC9oNT5cclxuICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cIm1sLTJcIiBzdHlsZT1cIm9wYWNpdHk6Ljg7bWFyZ2luLXRvcDoycHhcIj5cclxuICAgICAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pbWFnZXMvaWNvbl9kb3duX2Fycm93LnN2Z1wiIGFsdD1cImRvd25cIiB3aWR0aD1cIjEwcHhcIj5cclxuICAgICAgICAgICAgPC9zcGFuPiAtLT5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hbmdsZS1kb3duIG1sLTIgdGV4dC1ibHVlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjJweFwiPjwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ3VpZGUyXCIgKm5nSWY9XCJzaGFrZURlZGljYXRlZEJ0blwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZ3VpZGV0ZXh0XCI+UGxlYXNlIHNlbGVjdCBhIG51bWJlciBmcm9tIGJlbG93IGRyb3Bkb3duPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJjYWxsZXJJZExpc3QubGVuZ3RoOyBlbHNlIG5vQ2FsbGVySWRNZXNzYWdlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsbGVyLWlkLWxpc3QtY29udGFpbmVyXCIgKm5nSWY9XCJjYWxsZXJJZExpc3QubGVuZ3RoICYmICFpc01pbmltaXNlZFwiIGlkPVwiY2FsbGVySWRDb250YWluZXJcIiAgW25nQ2xhc3NdPVwieyd2aXNpYmxlJzogIWlzQ2FsbGVySWRIaWRkZW59XCIgPlxyXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgPCEtLSA8aDQ+U2VsZWN0IEMyQyBTb2Z0cGhvbmUgTnVtYmVyPC9oND4gLS0+XHJcbiAgICAgICAgIDxoND5NYWtlIG91dGdvaW5nIGNhbGwgdXNpbmc8L2g0PlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIlxyXG4gICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImlzQ2FsbGVySWRIaWRkZW4gPSB0cnVlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBjbG9zZVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDx1bD5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYWxsZXJJZCBvZiBjYWxsZXJJZExpc3RcIj5cclxuICAgICAgICAgIDxsaSBbbmdDbGFzc109XCJ7J3NlbGVjdGVkQ2FsbGVySWRDbGFzcyc6IGNhbGxlcklkPy5udW1iZXIgPT0gc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyfVwiIChjbGljayk9XCJvbkRlZGljYXRlZE51bVNlbGVjdChjYWxsZXJJZClcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCInZmkgZmktJyArIGNhbGxlcklkPy5pc29Db2RlPy50b0xvd2VyQ2FzZSgpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIHt7Y2FsbGVySWQ/Lm51bWJlcn19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c3Bhbj57e2NhbGxlcklkPy5jb3VudHJ5TmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC91bD5cclxuICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctdGVtcGxhdGUgI25vQ2FsbGVySWRNZXNzYWdlPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cIm5vLWNhbGxlci1pZC1tZXNzYWdlXCI+VG8gbWFrZSBhbnkgdm9pY2UgY2FsbHMsIHBsZWFzZSA8YSByb3V0ZXJMaW5rPVwiL2V4dGVuc2lvbi9kZWRpY2F0ZWRudW1iZXIve3t0b2tlbn19XCIgY2xhc3M9XCJjbGljay1oZXJlLWxpbmtcIiB0aXRsZT1cIlNldHRpbmdzID4gQzJDIE51bWJlclwiPnN1YnNjcmliZTwvYT4gdG8gYSB2b2ljZSBjYXBhYmxlIEMyQyBOdW1iZXIuXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGVkaWNhdGVkLW92ZXJsYXlcIiAqbmdJZj1cInNob3dEZWRpY2F0ZWRQb3B1cFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBkZWRpY2F0ZWROdW1Qb3B1cFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBjaG9vc2VEZWRpY2F0ZWRIZWFkZXJcIj5cclxuICAgICAgICAgIDxoNT5DaG9vc2UgQzJDIE51bWJlcjwvaDU+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZGlhbC1jbG9zZS1idG5cIiAoY2xpY2spPVwic2hvd0RlZGljYXRlZFBvcHVwID0gZmFsc2VcIj5jbG9zZTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGRlZGljYXRlZE51bUxpc3RcIj5cclxuICAgICAgICAgIDx1bD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2FsbGVySWQgb2YgY2FsbGVySWRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgPGxpIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRDYWxsZXJJZENsYXNzJzogY2FsbGVySWQ/Lm51bWJlciA9PSBzZWxlY3RlZENhbGxlcklkPy5udW1iZXJ9XCIgKGNsaWNrKT1cInNob3dEZWRpY2F0ZWRQb3B1cCA9IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCInZmkgZmktJyArIGNhbGxlcklkPy5pc29Db2RlPy50b0xvd2VyQ2FzZSgpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICB7e2NhbGxlcklkPy5udW1iZXJ9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57e2NhbGxlcklkPy5jb3VudHJ5TmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC91bD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1jYWxsLXdpZGdldFwiICpuZ0Zvcj1cImxldCBjYWxsIG9mIG5ld0luY29taW5nQ2FsbHM7bGV0IGkgPSBpbmRleFwiIFtuZ1N0eWxlXT1cInsndG9wJzogKDMwICsgaSAqIDcyKSArICdweCd9XCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImluYy11c2VyLWltZ1wiPlxyXG4gICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL3VzZXIuanBnXCIgYWx0PVwidXNlciBpbWFnZVwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgPCEtLSA8aDYgY2xhc3M9XCJtYi0xIGZvbnQtd2VpZ2h0LWJvbGRcIj5JbmNvbWluZyBDYWxsPC9oNj4gLS0+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJpbmMtdXNlci1uYW1lXCI+e3tjYWxsLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCduYW1lJyl9fTwvcD5cclxuICAgICAgICA8cD57e2NhbGwucGFyYW1ldGVycy5Gcm9tfX08L3A+XHJcblxyXG4gICAgICAgIDwhLS0gPHAgY2xhc3M9XCJpbmMtdXNlci1uYW1lXCI+Sm9obiBEb2U8L3A+IFxyXG4gICAgICAgIDxwPisxMjMzNzQ3MjQ4OTwvcD5cclxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtjb2xvcjojZDVkNWQ1ICFpbXBvcnRhbnQ7bWFyZ2luLXRvcDoycHhcIj5DYWxsIG9uICsxMjI2NDU4NDEwMDwvcD4gLS0+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpbmMtY2FsbC1idG4gaW5jLWFjY2VwdC1idG4gbXItMlwiIChjbGljayk9XCJhY2NlcHROZXdJbmNvbWluZ0NhbGwoY2FsbClcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+XHJcbiAgICAgICAgICAgIGNhbGxcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5jLWNhbGwtYnRuIGluYy1yZWplY3QtYnRuXCIgKGNsaWNrKT1cInJlamVjdE5ld0luY29taW5nQ2FsbChjYWxsKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj5cclxuICAgICAgICAgICAgY2FsbF9lbmRcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|