mt-portfolio
Version:
A Portfolio maker for Angular with image, heading, caption, ability to add contact form and demo
127 lines • 22.5 kB
JavaScript
import { transition, trigger, useAnimation } from '@angular/animations';
import { Component, Input } from '@angular/core';
import { PortfolioModel } from './slide.model';
import { fadeIn, fadeOut, flipIn, flipOut, jackIn, jackOut, scaleIn, scaleOut } from './mt-slideshow.component.animation';
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
import * as i2 from "./header.component";
import * as i3 from "@angular/common";
import * as i4 from "./swipe.directive";
import * as i5 from "./no-sanitize.pipe";
export class MtPortfolioComponent {
constructor(sanitizer) {
this.sanitizer = sanitizer;
this.portfolioList = [];
this.animationType = 'scale';
this.header = [];
this.currentSlide = 0;
}
onPreviousClick() {
const previous = this.currentSlide - 1;
this.currentSlide = previous < 0 ? this.portfolioList.length - 1 : previous;
// console.log("previous clicked, new current slide is: ", this.currentSlide);
}
onNextClick() {
const next = this.currentSlide + 1;
this.currentSlide = next === this.portfolioList.length ? 0 : next;
// console.log("next clicked, new current slide is: ", this.currentSlide);
}
ngOnInit() {
this.preloadImages();
if (location.hash !== "") {
const locationHash = this.portfolioList.find(s => { var _a; return ((_a = s.selectable) === null || _a === void 0 ? void 0 : _a.link) == location.hash; }) ? this.portfolioList.find(s => { var _a; return ((_a = s.selectable) === null || _a === void 0 ? void 0 : _a.link) == location.hash; }) : new PortfolioModel();
if (locationHash) {
this.currentSlide = this.portfolioList.indexOf(locationHash);
}
}
}
onSlideClick(slide) {
// const next = this.currentSlide + 1;
this.currentSlide = this.portfolioList.indexOf(slide);
}
preloadImages() {
for (const slide of this.portfolioList) {
new Image().src = slide.src;
}
}
}
MtPortfolioComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: MtPortfolioComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
MtPortfolioComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.4", type: MtPortfolioComponent, selector: "mt-portfolio", inputs: { portfolioList: "portfolioList", animationType: "animationType", header: "header" }, ngImport: i0, template: "<mt-header [headerList]=\"header\"></mt-header>\n<div class=\"container\">\n <div class=\"carousel\" *ngIf=\"portfolioList.length\">\n <ng-container *ngFor=\"let slide of portfolioList; let i = index\">\n <picture [@slideAnimation]=\"animationType\" swipe (next)=\"onNextClick()\" (previous)=\"onPreviousClick()\">\n <source media=\"(min-width:650px)\" srcset=\"{{slide.srcLarge? slide.srcLarge : slide.src}}\">\n <source media=\"(min-width:465px)\" srcset=\"{{slide.srcMedium? slide.srcMedium : slide.src}}\">\n <img *ngIf=\"i === currentSlide\" [src]=\"slide.src\" [alt]=\"slide.alt\" class=\"slide\"\n [@slideAnimation]=\"animationType\" />\n </picture>\n <div *ngIf=\"i === currentSlide\" class=\"my-name-div\" [style.right]=\"slide.x\" [style.top]=\"slide.y\"\n [@slideAnimation]=\"animationType\">\n <h1 class=\"header\" *ngIf=\"slide.selectable?.title\">\n {{slide.selectable?.title}}<span>{{slide.selectable?.titleFull}}</span></h1>\n <p *ngIf=\"slide.selectable?.caption\" [innerHTML]=\"slide.selectable?.caption | noSanitize\"></p>\n </div>\n\n </ng-container>\n\n\n <div class=\"control next selectable\">\n\n <div *ngFor=\"let slide of portfolioList; let i = index\">\n\n\n <a *ngIf=\"slide.selectable\" href=\"{{slide.selectable.link}}\"\n (click)=\"onSlideClick(slide)\">{{slide.selectable.linkTitle}}</a>\n </div>\n </div>\n\n <!-- controls -->\n <button *ngIf=\"currentSlide != 0\" class=\"control prev\" (click)=\"onPreviousClick()\">\n <span class=\"arrow left\"></span>\n </button>\n <button class=\"control next\" (click)=\"onNextClick()\">\n <span class=\"arrow right\"></span>\n </button>\n </div>\n</div>", styles: [".container{position:fixed;display:block;width:100vw;height:100vh;height:-webkit-fill-available}:host{flex:1}.carousel{position:relative;height:100%;width:100%;overflow:hidden}.slide{position:absolute;top:0;left:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .15s cubic-bezier(.25,.46,.45,.84)}.slide:hover{transform:scale(1.025)}.control{border:none;background-color:transparent;outline:0;position:absolute;cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.5em;color:#fff;font-weight:bold;font-size:3em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:20%;opacity:80%;transition:opacity .15s cubic-bezier(.25,.46,.45,.84);bottom:0}.control.selectable{bottom:40vh;text-align:center;font-size:large}.control.selectable a{color:#a9a9a9;text-decoration:none;padding:5px;border:2px solid #ff9933;display:block;margin-bottom:5px}.control.selectable a:hover,.control.selectable a:focus{color:#fff}.control:hover,.control:focus{opacity:1}.control.next{right:0}.control.prev{left:0}.arrow{display:block;border-left:.1em solid white;border-bottom:.1em solid white;width:.5em;height:.5em}.arrow.left{transform:rotate(45deg)}.arrow.right{transform:rotate(225deg)}.header{color:#f93;font-size:50px;font-weight:bold;font-family:monospace;letter-spacing:7px;cursor:pointer}@media (max-width: 641px){.header{font-size:40px}}.my-name-div{position:absolute;color:#f0f8ff;width:40vw}.header span{transition:1s linear}.header:hover span:nth-child(1){margin-right:5px}.header:hover span:nth-child(2){margin-left:30px}.header:hover span{color:#fff;text-shadow:0 0 10px #fff,0 0 20px #fff,0 0 40px #fff}\n"], components: [{ type: i2.HeaderComponent, selector: "mt-header", inputs: ["headerList"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.SwipeDirective, selector: "[swipe]", outputs: ["next", "previous"] }], pipes: { "noSanitize": i5.NoSanitizePipe }, animations: [
trigger("slideAnimation", [
/* scale */
transition("void => scale", [
useAnimation(scaleIn, { params: { time: "1500ms" } })
]),
transition("scale => void", [
useAnimation(scaleOut, { params: { time: "1500ms" } })
]),
/* fade */
transition("void => fade", [
useAnimation(fadeIn, { params: { time: "1750ms" } })
]),
transition("fade => void", [
useAnimation(fadeOut, { params: { time: "1750ms" } })
]),
/* flip */
transition("void => flip", [
useAnimation(flipIn, { params: { time: "500ms" } })
]),
transition("flip => void", [
useAnimation(flipOut, { params: { time: "500ms" } })
]),
/* JackInTheBox */
transition("void => jackInTheBox", [
useAnimation(jackIn, { params: { time: "700ms" } })
]),
transition("jackInTheBox => void", [
useAnimation(jackOut, { params: { time: "700ms" } })
])
])
] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: MtPortfolioComponent, decorators: [{
type: Component,
args: [{
selector: 'mt-portfolio',
templateUrl: './mt-portfolio.component.html',
styleUrls: ['./mt-portfolio.component.scss'],
animations: [
trigger("slideAnimation", [
/* scale */
transition("void => scale", [
useAnimation(scaleIn, { params: { time: "1500ms" } })
]),
transition("scale => void", [
useAnimation(scaleOut, { params: { time: "1500ms" } })
]),
/* fade */
transition("void => fade", [
useAnimation(fadeIn, { params: { time: "1750ms" } })
]),
transition("fade => void", [
useAnimation(fadeOut, { params: { time: "1750ms" } })
]),
/* flip */
transition("void => flip", [
useAnimation(flipIn, { params: { time: "500ms" } })
]),
transition("flip => void", [
useAnimation(flipOut, { params: { time: "500ms" } })
]),
/* JackInTheBox */
transition("void => jackInTheBox", [
useAnimation(jackIn, { params: { time: "700ms" } })
]),
transition("jackInTheBox => void", [
useAnimation(jackOut, { params: { time: "700ms" } })
])
])
]
}]
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { portfolioList: [{
type: Input
}], animationType: [{
type: Input
}], header: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXQtcG9ydGZvbGlvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL210LXBvcnRmb2xpby9zcmMvbXQvbXQtcG9ydGZvbGlvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL210LXBvcnRmb2xpby9zcmMvbXQvbXQtcG9ydGZvbGlvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBR3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7OztBQTJDMUgsTUFBTSxPQUFPLG9CQUFvQjtJQU0vQixZQUFvQixTQUF1QjtRQUF2QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBTGxDLGtCQUFhLEdBQXFCLEVBQUUsQ0FBQztRQUNyQyxrQkFBYSxHQUFHLE9BQU8sQ0FBQztRQUN4QixXQUFNLEdBQWtCLEVBQUUsQ0FBQztRQUNwQyxpQkFBWSxHQUFHLENBQUMsQ0FBQztJQUU4QixDQUFDO0lBRWhELGVBQWU7UUFDYixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQzVFLDhFQUE4RTtJQUNoRixDQUFD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RSxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDOzZCQUNwRCxDQUFDOzRCQUNGLFVBQVUsQ0FBQyxjQUFjLEVBQUU7Z0NBQ3pCLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQzs2QkFDckQsQ0FBQzs0QkFFRixrQkFBa0I7NEJBQ2xCLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRTtnQ0FDakMsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDOzZCQUNwRCxDQUFDOzRCQUNGLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRTtnQ0FDakMsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDOzZCQUNyRCxDQUFDO3lCQUNILENBQUM7cUJBQ0g7aUJBQ0Y7bUdBRVUsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRyYW5zaXRpb24sIHRyaWdnZXIsIHVzZUFuaW1hdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEhlYWRlck1vZGVsIH0gZnJvbSAnLi9oZWFkZXIubW9kZWwnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTW9kZWwgfSBmcm9tICcuL3NsaWRlLm1vZGVsJztcbmltcG9ydCB7IGZhZGVJbiwgZmFkZU91dCwgZmxpcEluLCBmbGlwT3V0LCBqYWNrSW4sIGphY2tPdXQsIHNjYWxlSW4sIHNjYWxlT3V0IH0gZnJvbSAnLi9tdC1zbGlkZXNob3cuY29tcG9uZW50LmFuaW1hdGlvbic7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXQtcG9ydGZvbGlvJyxcbiAgdGVtcGxhdGVVcmw6ICcuL210LXBvcnRmb2xpby5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL210LXBvcnRmb2xpby5jb21wb25lbnQuc2NzcyddLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcihcInNsaWRlQW5pbWF0aW9uXCIsIFtcbiAgICAgIC8qIHNjYWxlICovXG4gICAgICB0cmFuc2l0aW9uKFwidm9pZCA9PiBzY2FsZVwiLCBbXG4gICAgICAgIHVzZUFuaW1hdGlvbihzY2FsZUluLCB7IHBhcmFtczogeyB0aW1lOiBcIjE1MDBtc1wiIH0gfSlcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbihcInNjYWxlID0+IHZvaWRcIiwgW1xuICAgICAgICB1c2VBbmltYXRpb24oc2NhbGVPdXQsIHsgcGFyYW1zOiB7IHRpbWU6IFwiMTUwMG1zXCIgfSB9KVxuICAgICAgXSksXG5cbiAgICAgIC8qIGZhZGUgKi9cbiAgICAgIHRyYW5zaXRpb24oXCJ2b2lkID0+IGZhZGVcIiwgW1xuICAgICAgICB1c2VBbmltYXRpb24oZmFkZUluLCB7IHBhcmFtczogeyB0aW1lOiBcIjE3NTBtc1wiIH0gfSlcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbihcImZhZGUgPT4gdm9pZFwiLCBbXG4gICAgICAgIHVzZUFuaW1hdGlvbihmYWRlT3V0LCB7IHBhcmFtczogeyB0aW1lOiBcIjE3NTBtc1wiIH0gfSlcbiAgICAgIF0pLFxuXG4gICAgICAvKiBmbGlwICovXG4gICAgICB0cmFuc2l0aW9uKFwidm9pZCA9PiBmbGlwXCIsIFtcbiAgICAgICAgdXNlQW5pbWF0aW9uKGZsaXBJbiwgeyBwYXJhbXM6IHsgdGltZTogXCI1MDBtc1wiIH0gfSlcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbihcImZsaXAgPT4gdm9pZFwiLCBbXG4gICAgICAgIHVzZUFuaW1hdGlvbihmbGlwT3V0LCB7IHBhcmFtczogeyB0aW1lOiBcIjUwMG1zXCIgfSB9KVxuICAgICAgXSksXG5cbiAgICAgIC8qIEphY2tJblRoZUJveCAqL1xuICAgICAgdHJhbnNpdGlvbihcInZvaWQgPT4gamFja0luVGhlQm94XCIsIFtcbiAgICAgICAgdXNlQW5pbWF0aW9uKGphY2tJbiwgeyBwYXJhbXM6IHsgdGltZTogXCI3MDBtc1wiIH0gfSlcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbihcImphY2tJblRoZUJveCA9PiB2b2lkXCIsIFtcbiAgICAgICAgdXNlQW5pbWF0aW9uKGphY2tPdXQsIHsgcGFyYW1zOiB7IHRpbWU6IFwiNzAwbXNcIiB9IH0pXG4gICAgICBdKVxuICAgIF0pXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTXRQb3J0Zm9saW9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBwb3J0Zm9saW9MaXN0OiBQb3J0Zm9saW9Nb2RlbFtdID0gW107XG4gIEBJbnB1dCgpIGFuaW1hdGlvblR5cGUgPSAnc2NhbGUnO1xuICBASW5wdXQoKSBoZWFkZXI6IEhlYWRlck1vZGVsW10gPSBbXTtcbiAgY3VycmVudFNsaWRlID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7IH1cblxuICBvblByZXZpb3VzQ2xpY2soKSB7XG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmN1cnJlbnRTbGlkZSAtIDE7XG4gICAgdGhpcy5jdXJyZW50U2xpZGUgPSBwcmV2aW91cyA8IDAgPyB0aGlzLnBvcnRmb2xpb0xpc3QubGVuZ3RoIC0gMSA6IHByZXZpb3VzO1xuICAgIC8vIGNvbnNvbGUubG9nKFwicHJldmlvdXMgY2xpY2tlZCwgbmV3IGN1cnJlbnQgc2xpZGUgaXM6IFwiLCB0aGlzLmN1cnJlbnRTbGlkZSk7XG4gIH1cblxuICBvbk5leHRDbGljaygpIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5jdXJyZW50U2xpZGUgKyAxO1xuICAgIHRoaXMuY3VycmVudFNsaWRlID0gbmV4dCA9PT0gdGhpcy5wb3J0Zm9saW9MaXN0Lmxlbmd0aCA/IDAgOiBuZXh0O1xuICAgIC8vIGNvbnNvbGUubG9nKFwibmV4dCBjbGlja2VkLCBuZXcgY3VycmVudCBzbGlkZSBpczogXCIsIHRoaXMuY3VycmVudFNsaWRlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucHJlbG9hZEltYWdlcygpO1xuICAgIGlmIChsb2NhdGlvbi5oYXNoICE9PSBcIlwiKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbkhhc2ggPSB0aGlzLnBvcnRmb2xpb0xpc3QuZmluZChzID0+IHMuc2VsZWN0YWJsZT8ubGluayA9PSBsb2NhdGlvbi5oYXNoKSA/IHRoaXMucG9ydGZvbGlvTGlzdC5maW5kKHMgPT4gcy5zZWxlY3RhYmxlPy5saW5rID09IGxvY2F0aW9uLmhhc2gpIDogbmV3IFBvcnRmb2xpb01vZGVsKCk7XG4gICAgICBpZiAobG9jYXRpb25IYXNoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gdGhpcy5wb3J0Zm9saW9MaXN0LmluZGV4T2YobG9jYXRpb25IYXNoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblNsaWRlQ2xpY2soc2xpZGU6IFBvcnRmb2xpb01vZGVsKSB7XG4gICAgLy8gY29uc3QgbmV4dCA9IHRoaXMuY3VycmVudFNsaWRlICsgMTtcbiAgICB0aGlzLmN1cnJlbnRTbGlkZSA9IHRoaXMucG9ydGZvbGlvTGlzdC5pbmRleE9mKHNsaWRlKTtcbiAgfVxuXG5cbiAgcHJlbG9hZEltYWdlcygpIHtcbiAgICBmb3IgKGNvbnN0IHNsaWRlIG9mIHRoaXMucG9ydGZvbGlvTGlzdCkge1xuICAgICAgbmV3IEltYWdlKCkuc3JjID0gc2xpZGUuc3JjO1xuICAgIH1cbiAgfVxuXG5cbn1cbiIsIjxtdC1oZWFkZXIgW2hlYWRlckxpc3RdPVwiaGVhZGVyXCI+PC9tdC1oZWFkZXI+XG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhcm91c2VsXCIgKm5nSWY9XCJwb3J0Zm9saW9MaXN0Lmxlbmd0aFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzbGlkZSBvZiBwb3J0Zm9saW9MaXN0OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICA8cGljdHVyZSBbQHNsaWRlQW5pbWF0aW9uXT1cImFuaW1hdGlvblR5cGVcIiBzd2lwZSAobmV4dCk9XCJvbk5leHRDbGljaygpXCIgKHByZXZpb3VzKT1cIm9uUHJldmlvdXNDbGljaygpXCI+XG4gICAgICAgICAgICAgICAgPHNvdXJjZSBtZWRpYT1cIihtaW4td2lkdGg6NjUwcHgpXCIgc3Jjc2V0PVwie3tzbGlkZS5zcmNMYXJnZT8gc2xpZGUuc3JjTGFyZ2UgOiBzbGlkZS5zcmN9fVwiPlxuICAgICAgICAgICAgICAgIDxzb3VyY2UgbWVkaWE9XCIobWluLXdpZHRoOjQ2NXB4KVwiIHNyY3NldD1cInt7c2xpZGUuc3JjTWVkaXVtPyBzbGlkZS5zcmNNZWRpdW0gOiBzbGlkZS5zcmN9fVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJpID09PSBjdXJyZW50U2xpZGVcIiBbc3JjXT1cInNsaWRlLnNyY1wiIFthbHRdPVwic2xpZGUuYWx0XCIgY2xhc3M9XCJzbGlkZVwiXG4gICAgICAgICAgICAgICAgICAgIFtAc2xpZGVBbmltYXRpb25dPVwiYW5pbWF0aW9uVHlwZVwiIC8+XG4gICAgICAgICAgICA8L3BpY3R1cmU+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaSA9PT0gY3VycmVudFNsaWRlXCIgY2xhc3M9XCJteS1uYW1lLWRpdlwiIFtzdHlsZS5yaWdodF09XCJzbGlkZS54XCIgW3N0eWxlLnRvcF09XCJzbGlkZS55XCJcbiAgICAgICAgICAgICAgICBbQHNsaWRlQW5pbWF0aW9uXT1cImFuaW1hdGlvblR5cGVcIj5cbiAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJoZWFkZXJcIiAqbmdJZj1cInNsaWRlLnNlbGVjdGFibGU/LnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7c2xpZGUuc2VsZWN0YWJsZT8udGl0bGV9fTxzcGFuPnt7c2xpZGUuc2VsZWN0YWJsZT8udGl0bGVGdWxsfX08L3NwYW4+PC9oMT5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cInNsaWRlLnNlbGVjdGFibGU/LmNhcHRpb25cIiBbaW5uZXJIVE1MXT1cInNsaWRlLnNlbGVjdGFibGU/LmNhcHRpb24gfCBub1Nhbml0aXplXCI+PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBuZXh0IHNlbGVjdGFibGVcIj5cblxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2xpZGUgb2YgcG9ydGZvbGlvTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxuXG5cbiAgICAgICAgICAgICAgICA8YSAqbmdJZj1cInNsaWRlLnNlbGVjdGFibGVcIiBocmVmPVwie3tzbGlkZS5zZWxlY3RhYmxlLmxpbmt9fVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNsaWRlQ2xpY2soc2xpZGUpXCI+e3tzbGlkZS5zZWxlY3RhYmxlLmxpbmtUaXRsZX19PC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gY29udHJvbHMgLS0+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJjdXJyZW50U2xpZGUgIT0gMFwiIGNsYXNzPVwiY29udHJvbCBwcmV2XCIgKGNsaWNrKT1cIm9uUHJldmlvdXNDbGljaygpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFycm93IGxlZnRcIj48L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udHJvbCBuZXh0XCIgKGNsaWNrKT1cIm9uTmV4dENsaWNrKClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyb3cgcmlnaHRcIj48L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19