@sd-angular/core 1.3.210 → 1.3.212

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../node_modules/tslib/tslib.es6.js","../../../../projects/sd-core/upload-file/src/lib/upload-file.component.ts","../../../../projects/sd-core/upload-file/src/lib/upload-file.module.ts"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","this","n","v","op","TypeError","call","pop","length","push","Object","create","__values","o","s","m","i","__classPrivateFieldGet","receiver","state","kind","has","get","__classPrivateFieldSet","set","SdUploadFile","deviceService","ref","notifyService","translateService","_this","id","uuid.v4","_isMobileOrTablet","_canvas1","_canvas2","previewFiles","type","disabled","extensions","max","_srcs","previewWidth","previewHeight","align","_model","modelChange","EventEmitter","sdChange","_subscription","Subscription","_currentDropContainer","_srcChanges","Subject","_modelChanges","reload","Array","isArray","emit","_validate","file","split","name","translate","_a","lastDot","lastIndexOf","extension_1","substring","some","toUpperCase","join","maxSize","size","maxWidth","maxHeight","URL","window","webkitURL","img","Image","onload","width","height","src","createObjectURL","message","_b","_preview","previewFile","reader","FileReader","evt","previewSrc","target","isPreviewImage","detectChanges","readAsDataURL","_c","filter","_d","onUpload","$","children","remove","append","on","_uploadFile","trigger","files","originFiles","notify","warning","item","scaleToPixel","_resize","files_1","files_1_1","extension","fileName","idx","indexOf","onRemove","confirmDelete","splice","onDrop","event","moveItemInArray","previousIndex","currentIndex","canvas1","document","createElement","setAttribute","ctx1","getContext","_scale","canvas2","ctx2","drawImage","toBlob","blob","_blobToFile","err","scaleToPixcel","ratio","Math","trunc","onSelect","selectedFile","temp","lastModifiedDate","Date","isDesktop","defineProperty","prototype","srcs","model","flag_1","map","baseSrc","ngOnInit","ngAfterViewInit","add","pipe","startWith","subscribe","dropElements","dropContainer_1","first","nativeElement","addEventListener","preventDefault","style","opacity","border","dataTransfer","changes","dropContainer_2","ngOnDestroy","unsubscribe","Component","args","selector","template","DeviceDetectorService","ChangeDetectorRef","SdNotifyService","SdTranslateService","Input","Output","ViewChildren","ViewChild","ContentChild","SdLabelDefDirective","NgModule","imports","CommonModule","DeviceDetectorModule","forRoot","MatButtonModule","MatIconModule","DragDropModule","SdNotifyModule","SdTranslateModule","SdImagePreviewModule","declarations","exports","providers"],"mappings":";;;;;;;;;;;;;;6FAqEgBA,EAAUC,EAASC,EAAYC,EAAGC,GAE9C,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IAAMC,EAAKN,EAAUO,KAAKF,IAAW,MAAOG,GAAKL,EAAOK,IACpF,SAASC,EAASJ,GAAS,IAAMC,EAAKN,EAAiB,MAAEK,IAAW,MAAOG,GAAKL,EAAOK,IACvF,SAASF,EAAKI,GAJlB,IAAeL,EAIaK,EAAOC,KAAOT,EAAQQ,EAAOL,QAJ1CA,EAIyDK,EAAOL,MAJhDA,aAAiBN,EAAIM,EAAQ,IAAIN,GAAE,SAAUG,GAAWA,EAAQG,OAITO,KAAKR,EAAWK,GAClGH,GAAMN,EAAYA,EAAUa,MAAMhB,EAASC,GAAc,KAAKS,oBAItDO,EAAYjB,EAASkB,GACjC,IAAsGC,EAAGC,EAAGC,EAAGC,EAA3GC,EAAI,CAAEC,MAAO,EAAGC,KAAM,WAAa,GAAW,EAAPJ,EAAE,GAAQ,MAAMA,EAAE,GAAI,OAAOA,EAAE,IAAOK,KAAM,GAAIC,IAAK,IAChG,OAAOL,EAAI,CAAEZ,KAAMkB,EAAK,GAAIC,MAASD,EAAK,GAAIE,OAAUF,EAAK,IAAwB,mBAAXG,SAA0BT,EAAES,OAAOC,UAAY,WAAa,OAAOC,OAAUX,EACvJ,SAASM,EAAKM,GAAK,OAAO,SAAUC,GAAK,OACzC,SAAcC,GACV,GAAIjB,EAAG,MAAM,IAAIkB,UAAU,mCAC3B,KAAOd,OACH,GAAIJ,EAAI,EAAGC,IAAMC,EAAY,EAARe,EAAG,GAAShB,EAAU,OAAIgB,EAAG,GAAKhB,EAAS,SAAOC,EAAID,EAAU,SAAMC,EAAEiB,KAAKlB,GAAI,GAAKA,EAAEV,SAAWW,EAAIA,EAAEiB,KAAKlB,EAAGgB,EAAG,KAAKtB,KAAM,OAAOO,EAE3J,OADID,EAAI,EAAGC,IAAGe,EAAK,CAAS,EAARA,EAAG,GAAQf,EAAEb,QACzB4B,EAAG,IACP,KAAK,EAAG,KAAK,EAAGf,EAAIe,EAAI,MACxB,KAAK,EAAc,OAAXb,EAAEC,QAAgB,CAAEhB,MAAO4B,EAAG,GAAItB,MAAM,GAChD,KAAK,EAAGS,EAAEC,QAASJ,EAAIgB,EAAG,GAAIA,EAAK,CAAC,GAAI,SACxC,KAAK,EAAGA,EAAKb,EAAEI,IAAIY,MAAOhB,EAAEG,KAAKa,MAAO,SACxC,QACI,KAAMlB,EAAIE,EAAEG,MAAML,EAAIA,EAAEmB,OAAS,GAAKnB,EAAEA,EAAEmB,OAAS,KAAkB,IAAVJ,EAAG,IAAsB,IAAVA,EAAG,IAAW,CAAEb,EAAI,EAAG,SACjG,GAAc,IAAVa,EAAG,MAAcf,GAAMe,EAAG,GAAKf,EAAE,IAAMe,EAAG,GAAKf,EAAE,IAAM,CAAEE,EAAEC,MAAQY,EAAG,GAAI,MAC9E,GAAc,IAAVA,EAAG,IAAYb,EAAEC,MAAQH,EAAE,GAAI,CAAEE,EAAEC,MAAQH,EAAE,GAAIA,EAAIe,EAAI,MAC7D,GAAIf,GAAKE,EAAEC,MAAQH,EAAE,GAAI,CAAEE,EAAEC,MAAQH,EAAE,GAAIE,EAAEI,IAAIc,KAAKL,GAAK,MACvDf,EAAE,IAAIE,EAAEI,IAAIY,MAChBhB,EAAEG,KAAKa,MAAO,SAEtBH,EAAKlB,EAAKoB,KAAKtC,EAASuB,GAC1B,MAAOZ,GAAKyB,EAAK,CAAC,EAAGzB,GAAIS,EAAI,UAAeD,EAAIE,EAAI,EACtD,GAAY,EAARe,EAAG,GAAQ,MAAMA,EAAG,GAAI,MAAO,CAAE5B,MAAO4B,EAAG,GAAKA,EAAG,QAAK,EAAQtB,MAAM,GArB9BL,CAAK,CAACyB,EAAGC,MAyBhCO,OAAOC,gBAYpBC,EAASC,GACrB,IAAIC,EAAsB,mBAAXf,QAAyBA,OAAOC,SAAUe,EAAID,GAAKD,EAAEC,GAAIE,EAAI,EAC5E,GAAID,EAAG,OAAOA,EAAET,KAAKO,GACrB,GAAIA,GAAyB,iBAAbA,EAAEL,OAAqB,MAAO,CAC1C9B,KAAM,WAEF,OADImC,GAAKG,GAAKH,EAAEL,SAAQK,OAAI,GACrB,CAAErC,MAAOqC,GAAKA,EAAEG,KAAMlC,MAAO+B,KAG5C,MAAM,IAAIR,UAAUS,EAAI,0BAA4B,mCAiFxD,kCAAyBJ,OAAOC,gBAkBhBM,EAAuBC,EAAUC,EAAOC,EAAMjC,GAC1D,GAAa,MAATiC,IAAiBjC,EAAG,MAAM,IAAIkB,UAAU,iDAC5C,GAAqB,mBAAVc,EAAuBD,IAAaC,IAAUhC,GAAKgC,EAAME,IAAIH,GAAW,MAAM,IAAIb,UAAU,4EACvG,MAAgB,MAATe,EAAejC,EAAa,MAATiC,EAAejC,EAAEmB,KAAKY,GAAY/B,EAAIA,EAAEX,MAAQ2C,EAAMG,IAAIJ,YAGxEK,EAAuBL,EAAUC,EAAO3C,EAAO4C,EAAMjC,GACjE,GAAa,MAATiC,EAAc,MAAM,IAAIf,UAAU,kCACtC,GAAa,MAATe,IAAiBjC,EAAG,MAAM,IAAIkB,UAAU,iDAC5C,GAAqB,mBAAVc,EAAuBD,IAAaC,IAAUhC,GAAKgC,EAAME,IAAIH,GAAW,MAAM,IAAIb,UAAU,2EACvG,MAAiB,MAATe,EAAejC,EAAEmB,KAAKY,EAAU1C,GAASW,EAAIA,EAAEX,MAAQA,EAAQ2C,EAAMK,IAAIN,EAAU1C,GAASA,mBC5ItG,SAAAiD,EACEC,EACQC,EACAC,EACAC,GAJV,IAAAC,EAAA7B,KAEUA,KAAA0B,IAAAA,EACA1B,KAAA2B,cAAAA,EACA3B,KAAA4B,iBAAAA,EArEV5B,KAAA8B,GAAK,IAAIC,EAAAA,KACTC,EAAAT,IAAAvB,MAAoB,GACpBiC,EAAAV,IAAAvB,KAAW,IAAI+B,EAAAA,MACfG,EAAAX,IAAAvB,KAAW,IAAI+B,EAAAA,MACf/B,KAAAmC,aAA8B,GAGrBnC,KAAAoC,KAAyB,OACzBpC,KAAAqC,UAAW,EACXrC,KAAAsC,WAAuB,GACvBtC,KAAAuC,IAAM,EAKfC,EAAAjB,IAAAvB,UAAA,GAOSA,KAAAyC,aAAuB,QACvBzC,KAAA0C,cAAwB,QACxB1C,KAAA2C,MAA2B,SACpCC,EAAArB,IAAAvB,UAAA,GA+BUA,KAAA6C,YAAc,IAAIC,EAAAA,aAClB9C,KAAA+C,SAAW,IAAID,EAAAA,aAIzBE,EAAAzB,IAAAvB,KAAgB,IAAIiD,EAAAA,cACpBC,EAAA3B,IAAAvB,UAAA,GACAmD,EAAA5B,IAAAvB,KAAc,IAAIoD,EAAAA,SAClBC,EAAA9B,IAAAvB,KAAgB,IAAIoD,EAAAA,SAgGpBpD,KAAAsD,OAAS,SAACnB,GACJoB,MAAMC,QAAQrB,KAChBN,EAAKM,aAAeA,EACpBN,EAAKgB,YAAYY,KAAKtB,KAK1BuB,EAAAnC,IAAAvB,MAAY,SAAO2D,GAAU,OAAA7F,EAAA+D,OAAA,OAAA,GAAA,gFAC3B,MAAkB,UAAd7B,KAAKoC,MACyB,UAA5BuB,EAAKvB,KAAKwB,MAAM,KAAK,GACvB,CAAA,EAAO,IAAID,EAAKE,KAAI,KAAK7D,KAAK4B,iBAAiBkC,UAAU,mCAG1C,QAAnBC,EAAI/D,KAAKsC,kBAAU,IAAAyB,OAAA,EAAAA,EAAExD,UACbyD,EAAUL,EAAKE,KAAKI,YAAY,KAChCC,EAAYP,EAAKE,KAAKM,UAAUH,EAAU,IAC3ChE,KAAKsC,WAAW8B,MAAK,SAAA1F,GAAK,OAAAA,EAAE2F,gBAAkBH,EAAUG,kBAC3D,CAAA,EAAO,IAAIV,EAAKE,KAAI,KAAK7D,KAAK4B,iBAAiBkC,UAAU,wCAAuC,IAAI9D,KAAKsC,WAAWgC,KAAK,OAGzHtE,KAAKuE,SACY,KAAfvE,KAAKuE,QAAiB,KAAOZ,EAAKa,KACpC,CAAA,EAAO,IAAIb,EAAKE,KAAI,KAAK7D,KAAK4B,iBAAiBkC,UAAU,iBAAgB,IAAI9D,KAAKuE,QAAO,QAG3E,UAAdvE,KAAKoC,OAAqBpC,KAAKyE,WAAYzE,KAAK0E,UAAhD,CAAA,EAAA,GACsB,CAAA,EAAM,IAAIvG,SAAQ,SAAAC,GACxC,IAAMuG,EAAMC,OAAOD,KAAOC,OAAOC,UAC3BC,EAAM,IAAIC,MAChBD,EAAIE,OAAS,WACPnD,EAAK4C,UAAYK,EAAIG,MAAQpD,EAAK4C,UACpCrG,EAAQ,IAAIuF,EAAKE,KAAI,KAAKhC,EAAKD,iBAAiBkC,UAAU,mBAAkB,IAAIjC,EAAK4C,SAAQ,MAE3F5C,EAAK6C,WAAaI,EAAII,OAASrD,EAAK6C,WACtCtG,EAAQ,IAAIuF,EAAKE,KAAI,KAAKhC,EAAKD,iBAAiBkC,UAAU,oBAAmB,IAAIjC,EAAK6C,UAAS,MAEjGtG,EAAQ,OAEV0G,EAAIK,IAAMR,EAAIS,gBAAgBzB,cAEhC,GAdM0B,EAAkBC,EAAA9F,OAetB,MAAA,CAAA,EAAO6F,oBAGX,MAAA,CAAA,EAAO,gBAGTE,EAAAhE,IAAAvB,MAAW,8BACEwF,GACT,IAAMC,EAAS,IAAIC,WACnBD,EAAOT,OAAS,SAACW,SACfH,EAAYI,WAAaD,EAAIE,OAAOjH,OACpC4G,EAAYM,eAA0D,WAAzB,QAAhB/B,EAAAyB,EAAY7B,YAAI,IAAAI,OAAA,EAAAA,EAAE3B,KAAKwB,MAAM,KAAK,IAC/D/B,EAAKH,IAAIqE,iBAEXN,EAAOO,cAAcR,EAAY7B,WAPnC,IAA0B,IAAAsC,EAAAtF,EAAAkB,EAAKM,aAAa+D,QAAO,SAAAxH,GAAK,OAAAA,EAAEiF,SAAKwC,EAAAF,EAAAxH,QAAA0H,EAAAtH,KAAAsH,EAAAF,EAAAxH,OAAA,GAAzC0H,EAAA5H,6GAWxByB,KAAAoG,SAAW,SAACZ,GACNa,EAAAA,QAAE,IAAIxE,EAAKC,IAAMvB,QACnB8F,EAAAA,QAAE,QAAQC,SAAS,IAAIzE,EAAKC,IAAMyE,SAEhCf,GAA4B,IAAb3D,EAAKU,IACtB8D,EAAAA,QAAE,QAAQG,OAAO,cAAc3E,EAAKC,GAAE,0CAEtCuE,EAAAA,QAAE,QAAQG,OAAO,cAAc3E,EAAKC,GAAE,mDAExCuE,EAAAA,QAAE,IAAIxE,EAAKC,IAAM2E,GAAG,UAAU,SAAOd,GAAQ,OAAA7H,EAAA+D,OAAA,OAAA,GAAA,6DAC3C,MAAA,CAAA,EAAMb,EAAAhB,KAAA0G,GAAArG,KAAAL,KAAiB2F,EAAIE,OAAQL,kBAAnCF,EAAA9F,OACA6G,EAAAA,QAAE,QAAQC,SAAS,IAAItG,KAAK8B,IAAMyE,uBAEpCF,EAAAA,QAAE,IAAIxE,EAAKC,IAAM6E,QAAQ,UAG3BD,EAAAnF,IAAAvB,MAAc,SAAO6F,EAAsBL,GAAyB,OAAA1H,EAAA+D,OAAA,OAAA,GAAA,yFAClE,IAAKgE,EAAOe,MAAMrG,OAChB,MAAA,CAAA,MAEIsG,EAAchB,EAAOe,MACrBA,EAAgB,GACjBpB,EAAD,MAAA,CAAA,EAAA,GACF,GAAIqB,EAAYtG,OAASP,KAAKmC,aAAa5B,OAASP,KAAKuC,IAEvD,OADAvC,KAAK2B,cAAcmF,OAAOC,QAAW/G,KAAK4B,iBAAiBkC,UAAU,uBAAsB,IAAI9D,KAAKuC,KACpG,CAAA,GAEOxB,EAAI,0BAAGA,EAAI8F,EAAYtG,QAC1BoD,EAAOkD,EAAYG,KAAKjG,GACV,UAAdf,KAAKoC,MAAoBpC,KAAKiH,aAAe,EACxC,CAAA,EAAMjG,EAAAhB,KAAAkH,GAAA7G,KAAAL,KAAa2D,IADxB,CAAA,EAAA,IAFgC,CAAA,EAAA,UAGlCA,EAAOsC,EAAAzG,wBAEO,MAAA,CAAA,EAAMwB,EAAAhB,KAAA0D,GAAArD,KAAAL,KAAe2D,WACrC,GADM0B,EAAUY,EAAAzG,OAGd,OADAQ,KAAK2B,cAAcmF,OAAOC,QAAQ1B,GAClC,CAAA,GAEFuB,EAAMpG,KAAKmD,2BAV2B5C,qBAYxC,IAAmBoG,EAAAxG,EAAAiG,GAAKQ,EAAAD,EAAA1I,QAAA2I,EAAAvI,KAAAuI,EAAAD,EAAA1I,OAAbkF,EAAIyD,EAAA7I,MACPyF,EAAUL,EAAKE,KAAKI,YAAY,KAChCoD,EAAY1D,EAAKE,KAAKM,UAAUH,EAAU,GAChDhE,KAAKmC,aAAa3B,KAAK,CACrBmD,KAAIA,EACJmC,gBAAgB,EAChBF,WAAY,KACZT,IAAK,KACLmC,SAAU3D,EAAKE,KACfwD,UAASA,gIAIPE,EAAMvH,KAAKmC,aAAaqF,QAAQhC,GAClC7B,EAAOkD,EAAYG,KAAK,GACV,UAAdhH,KAAKoC,MAAoBpC,KAAKiH,aAAe,EACxC,CAAA,EAAMjG,EAAAhB,KAAAkH,GAAA7G,KAAAL,KAAa2D,IADxB,CAAA,EAAA,UACFA,EAAOsC,EAAAzG,wBAEHwE,EAAUL,EAAKE,KAAKI,YAAY,KAChCoD,EAAY1D,EAAKE,KAAKM,UAAUH,EAAU,GAChDhE,KAAKmC,aAAaoF,GAAO,CACvB5D,KAAIA,EACJmC,gBAAgB,EAChBF,WAAY,KACZT,IAAK,KACLmC,SAAU3D,EAAKE,KACfwD,UAASA,6BAGbrG,EAAAhB,KAAAuF,GAAAlF,KAAAL,MACAA,KAAK6C,YAAYY,KAAKzD,KAAKmC,cAC3BnC,KAAK+C,SAASU,KAAKzD,KAAKmC,cACxBnC,KAAK0B,IAAIqE,8BAGX/F,KAAAyH,SAAW,SAACjC,GACV3D,EAAKF,cAAc+F,gBAAgB5I,MAAK,WACtC,IAAMyI,EAAM1F,EAAKM,aAAaqF,QAAQhC,GACtC3D,EAAKM,aAAawF,OAAOJ,EAAK,GAC9B1F,EAAKgB,YAAYY,KAAK5B,EAAKM,cAC3BN,EAAKkB,SAASU,KAAK5B,EAAKM,kBAI5BnC,KAAA4H,OAAS,SAACC,GACRC,EAAAA,gBAAgBjG,EAAKM,aAAc0F,EAAME,cAAeF,EAAMG,cAC9DnG,EAAKgB,YAAYY,KAAK5B,EAAKM,cAC3BN,EAAKkB,SAASU,KAAK5B,EAAKM,eAG1B+E,EAAA3F,IAAAvB,MAAU,SAAO2D,GAAU,OAAA7F,EAAA+D,OAAA,OAAA,GAAA,0EACzB,OAAK7B,KAAKiH,cAIO,KADXjD,EAAUL,EAAKE,KAAKI,YAAY,MAEpC,CAAA,EAAON,GAEF,CAAA,EAAM,IAAIxF,SAAQ,SAACC,EAASC,GACjC,IAAMsG,EAAMC,OAAOD,KAAOC,OAAOC,UAC3BC,EAAM,IAAIC,MAChBD,EAAIE,OAAS,WACX,IACE,GAAIF,EAAIG,MAAQH,EAAII,QAAUrD,EAAKoF,aACjC,OAAO7I,EAAQuF,GAEjB,IAAMsE,EAAUC,SAASC,cAAc,UACvCF,EAAQG,aAAa,KAAIpH,EAAAa,EAAAI,IACzB,IAAMoG,EAAOJ,EAAQK,WAAW,MAC1BhD,EAAoBtE,EAAAa,EAAA0G,GAAAlI,KAAAwB,EAAYiD,EAAIG,MAAOH,EAAII,OAAQrD,EAAKoF,cAA1DhC,EAAKK,EAAAL,MAAEC,EAAMI,EAAAJ,OACrB+C,EAAQhD,MAAQA,EAChBgD,EAAQ/C,OAASA,EAEjB,IAAMsD,EAAUN,SAASC,cAAc,UACvCK,EAAQJ,aAAa,KAAIpH,EAAAa,EAAAK,IACzB,IAAMuG,EAAOD,EAAQF,WAAW,MAChCE,EAAQvD,MAAQA,EAChBuD,EAAQtD,OAASA,EACjBuD,EAAKC,UAAU5D,EAAK,EAAG,EAAG0D,EAAQvD,MAAOuD,EAAQtD,QACjDuD,EAAKC,UAAUF,EAAS,EAAG,EAAmB,GAAhBA,EAAQvD,MAA8B,GAAjBuD,EAAQtD,QAC3DmD,EAAKK,UAAUF,EAAS,EAAG,EAAmB,GAAhBA,EAAQvD,MAA8B,GAAjBuD,EAAQtD,OAAc,EAAG,EAAG+C,EAAQhD,MAAOgD,EAAQ/C,QACtG+C,EAAQU,QAAO,SAAAC,GACbxK,EAAQ4C,EAAAa,EAAAgH,GAAAxI,KAAAwB,EAAiB+G,EAASjF,EAAKE,KAAKM,UAAU,EAAGH,GAAQ,YAEnE,MAAO8E,GACPzK,EAAOyK,WAEPzC,EAAAA,QAAE,IAAIrF,EAAAa,EAAAI,IAAiBsE,SACvBF,EAAAA,QAAE,IAAIrF,EAAAa,EAAAK,IAAiBqE,WAG3BzB,EAAIK,IAAMR,EAAIS,gBAAgBzB,OAvC9B,CAAA,EAAOA,UAMT,MAAA,CAAA,EAAO2B,EAAA9F,kBAqCT+I,EAAAhH,IAAAvB,MAAS,SAACiF,EAAeC,EAAgB6D,GACvC,IAAK9D,IAAUC,IAAW6D,EACxB,MAAO,CACL9D,MAAKA,EACLC,OAAMA,GAIV,IADA,IAAM8D,EAAQ/D,EAAQC,EACbnE,EAAI,EAAGA,EAAIkE,MAClBA,GAASlE,IACTmE,EAAS+D,KAAKC,MAAMjE,EAAQ+D,KACND,GAHGhI,KAO3B,MAAO,CACLkE,MAAKA,EACLC,OAAMA,MAIVlF,KAAAmJ,SAAW,SAACxF,GACN3C,EAAAa,EAAAG,KAGAH,EAAKuH,eAAiBzF,EACxB9B,EAAKuH,aAAezF,EAEpB9B,EAAKuH,aAAe,OAIxBP,EAAAtH,IAAAvB,MAAc,SAAC4I,EAAYtB,GACzB,IAAM+B,EAAYT,EAGlB,OAFAS,EAAKC,iBAAmB,IAAIC,KAC5BF,EAAKxF,KAAOyD,EACLsB,KAhUPtH,EAAAtB,KAAIgC,GAAsBP,EAAc+H,oBAtD1C/I,OAAAgJ,eAAajI,EAAAkI,UAAA,OAAI,KAAjB,SAAkBC,GACZpG,MAAMC,QAAQmG,KAChBrI,EAAAtB,KAAIwC,EAASmH,GACb3I,EAAAhB,KAAAmD,GAAiB1E,KAAIuC,EAAAhB,KAAAwC,sCAOzB/B,OAAAgJ,eAAajI,EAAAkI,UAAA,QAAK,KAAlB,SAAmBE,GAAnB,IAAA/H,EAAA7B,KACE,GAAIuD,MAAMC,QAAQoG,IAAU5I,EAAAhB,KAAA4C,KAAgBgH,EAAO,CACjD,IAAIC,GAAO,EACXvI,EAAAtB,KAAI4C,EAAUgH,EAAME,KAAI,SAAA3E,SACtB,GAAqB,iBAAjB,EAA2B,CAC7B,IAAIkC,EAAY,KACV0C,EAAwB,QAAjBhG,EAAGoB,EAAIvB,MAAM,YAAI,IAAAG,OAAA,EAAAA,EAAG,GAC3BC,EAAU+F,EAAQ9F,YAAY,KAKpC,OAJID,EAAU,IACZqD,EAAY0C,EAAQ5F,UAAUH,EAAU,IAE1C6F,GAAO,EACA,CACLlG,KAAM,KACNiC,WAAY,KACZT,IAAGA,EACHW,eAA8B,UAAdjE,EAAKO,KACrBiF,UAASA,GAGb,OAAOlC,MAEL0E,GACF7J,KAAK6C,YAAYY,KAAIzC,EAAAhB,KAAA4C,IAEvB5B,EAAAhB,KAAAqD,GAAmB5E,KAAIuC,EAAAhB,KAAA4C,SAEvBtB,EAAAtB,KAAI4C,EAAU,qCAoBlBpB,EAAAkI,UAAAM,SAAA,aAIAxI,EAAAkI,UAAAO,gBAAA,WAAA,IAAApI,EAAA7B,KA6BE,GA5BAgB,EAAAhB,KAAAgD,GAAmBkH,IAAIlJ,EAAAhB,KAAAmD,GAAiBgH,KAAKC,EAAAA,UAASpJ,EAAAhB,KAAAwC,KAAc6H,WAAU,WAC5E,GAAK9G,MAAMC,QAAOxC,EAAAa,EAAAW,IAAlB,CAGA,IAAML,EAAenB,EAAAa,EAAAW,GAAWsH,KAAI,SAAA3E,SAC9BkC,EAAY,KACV0C,EAAwB,QAAjBhG,EAAGoB,EAAIvB,MAAM,YAAI,IAAAG,OAAA,EAAAA,EAAG,GAC3BC,EAAU+F,EAAQ9F,YAAY,KAIpC,OAHID,EAAU,IACZqD,EAAY0C,EAAQ5F,UAAUH,EAAU,IAEnC,CACLL,KAAM,KACNiC,WAAY,KACZT,IAAGA,EACHW,eAA8B,UAAdjE,EAAKO,KACrBiF,UAASA,MAGbxF,EAAKM,aAAeA,EACpBN,EAAKgB,YAAYY,KAAKtB,QAGxBnB,EAAAhB,KAAAgD,GAAmBkH,IAAIlJ,EAAAhB,KAAAqD,GAAmB8G,KAAKC,EAAAA,UAAU,KAAKC,WAAU,WAClE9G,MAAMC,QAAOxC,EAAAa,EAAAe,MACff,EAAKM,aAAYnB,EAAAa,EAAAe,SAGjB5B,EAAAhB,KAAAgC,GAAyB,CAC3B,GAAIhC,KAAKsK,aAAa/J,OAAS,EAAG,CAChC,IAAMgK,EAAgBvK,KAAKsK,aAAaE,MAAMC,cAC9CnJ,EAAAtB,KAAIkD,EAAyBqH,GAC7BA,EAAcG,iBAAiB,YAAY,SAAC/E,GAC1CA,EAAIgF,iBACJJ,EAAcK,MAAMC,QAAU,GAC9BN,EAAcK,MAAME,OAAS,oBAE/BP,EAAcG,iBAAiB,aAAa,SAAC/E,GAC3CA,EAAIgF,oBAENJ,EAAcG,iBAAiB,aAAa,SAAC/E,GAC3C4E,EAAcK,MAAMC,QAAU,GAC9BN,EAAcK,MAAME,OAAS,qBAE/BP,EAAcG,iBAAiB,QAAQ,SAAO/E,GAAc,OAAA7H,EAAA+D,OAAA,OAAA,GAAA,6DAI1D,OAHA8D,EAAIgF,iBACJJ,EAAcK,MAAMC,QAAU,GAC9BN,EAAcK,MAAME,OAAS,kBAC7B,CAAA,EAAM9J,EAAAhB,KAAA0G,GAAArG,KAAAL,KAAiB2F,EAAIoF,6BAA3BzF,EAAA9F,qBAGJwB,EAAAhB,KAAAgD,GAAmBkH,IAAIlK,KAAKsK,aAAaU,QAAQX,WAAU,WACzD,GAAIxI,EAAKyI,aAAa/J,OAAS,GAAKS,EAAAa,EAAAqB,KAA+BrB,EAAKyI,aAAaE,MAAMC,cAAe,CACxG,IAAMQ,EAAgBpJ,EAAKyI,aAAaE,MAAMC,cAC9CnJ,EAAAO,EAAIqB,EAAyB+H,GAC7BA,EAAcP,iBAAiB,YAAY,SAAC/E,GAC1CA,EAAIgF,iBACJM,EAAcL,MAAMC,QAAU,GAC9BI,EAAcL,MAAME,OAAS,oBAE/BG,EAAcP,iBAAiB,aAAa,SAAC/E,GAC3CA,EAAIgF,oBAENM,EAAcP,iBAAiB,aAAa,SAAC/E,GAC3CsF,EAAcL,MAAMC,QAAU,GAC9BI,EAAcL,MAAME,OAAS,qBAE/BG,EAAcP,iBAAiB,QAAQ,SAAO/E,GAAc,OAAA7H,EAAA+D,OAAA,OAAA,GAAA,6DAI1D,OAHA8D,EAAIgF,iBACJM,EAAcL,MAAMC,QAAU,GAC9BI,EAAcL,MAAME,OAAS,kBAC7B,CAAA,EAAM9J,EAAAhB,KAAA0G,GAAArG,KAAAL,KAAiB2F,EAAIoF,6BAA3BzF,EAAA9F,4BAOVgC,EAAAkI,UAAAwB,YAAA,WACElK,EAAAhB,KAAAgD,GAAmBmI,0PAnKtBC,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,iBACVC,SAAA,y9pIAZOC,EAAAA,6BAXPC,EAAAA,yBAcOC,EAAAA,uBACAC,EAAAA,qDAkBNC,EAAAA,oBACAA,EAAAA,wBACAA,EAAAA,0BACAA,EAAAA,mBACAA,EAAAA,uBACAA,EAAAA,wBACAA,EAAAA,yBACAA,EAAAA,4BACAA,EAAAA,oBAEAA,EAAAA,4BAMAA,EAAAA,6BACAA,EAAAA,qBACAA,EAAAA,qBAEAA,EAAAA,2BA8BAC,EAAAA,yBACAA,EAAAA,6BACAC,EAAAA,aAAYT,KAAA,CAAC,+BACbU,EAAAA,UAASV,KAAA,CAAC,8BACVW,EAAAA,aAAYX,KAAA,CAACY,EAAAA,8BC7DhB,iCApBCC,EAAAA,SAAQb,KAAA,CAAC,CACRc,QAAS,CACPC,EAAAA,aACAC,EAAAA,qBAAqBC,UACrBC,EAAAA,gBACAC,EAAAA,cACAC,EAAAA,eACAC,EAAAA,eACAC,EAAAA,kBACAC,EAAAA,sBAEFC,aAAc,CACZrL,GAEFsL,QAAS,CACPtL,GAEFuL,UAAW","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectorRef,\r\n AfterViewInit,\r\n ElementRef,\r\n OnInit,\r\n ViewChildren,\r\n QueryList,\r\n OnDestroy,\r\n ViewChild,\r\n ContentChild\r\n} from '@angular/core';\r\nimport { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { DeviceDetectorService } from 'ngx-device-detector';\r\nimport * as uuid from 'uuid';\r\nimport $ from 'jquery';\r\nimport { SdNotifyService } from '@sd-angular/core/notify';\r\nimport { SdTranslateService } from '@sd-angular/core/translate';\r\nimport { Subscription, Subject } from 'rxjs';\r\nimport { startWith } from 'rxjs/operators';\r\nimport { SdLabelDefDirective } from '@sd-angular/core/common';\r\n\r\n// https://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded\r\n@Component({\r\n selector: 'sd-upload-file',\r\n templateUrl: './upload-file.component.html',\r\n styleUrls: ['./upload-file.component.scss']\r\n})\r\nexport class SdUploadFile implements OnInit, AfterViewInit, OnDestroy {\r\n id = `I${uuid.v4()}`;\r\n #isMobileOrTablet = false;\r\n #canvas1 = `C${uuid.v4()}`;\r\n #canvas2 = `C${uuid.v4()}`;\r\n previewFiles: PreviewFile[] = [];\r\n selectedFile: PreviewFile;\r\n @Input() label: string;\r\n @Input() type: 'image' | 'file' = 'file';\r\n @Input() disabled = false;\r\n @Input() extensions: string[] = [];\r\n @Input() max = 1;\r\n @Input() maxSize: number;\r\n @Input() maxWidth: number;\r\n @Input() maxHeight: number;\r\n @Input() scaleToPixel: number;\r\n #srcs: string[];\r\n @Input() set srcs(srcs: string[]) {\r\n if (Array.isArray(srcs)) {\r\n this.#srcs = srcs;\r\n this.#srcChanges.next(this.#srcs);\r\n }\r\n }\r\n @Input() previewWidth: string = '100px';\r\n @Input() previewHeight: string = '100px';\r\n @Input() align: 'left' | 'center' = 'center';\r\n #model: PreviewFile[];\r\n @Input() set model(model: (string | PreviewFile)[]) {\r\n if (Array.isArray(model) && this.#model !== model) {\r\n let flag = false;\r\n this.#model = model.map(src => {\r\n if (typeof (src) === 'string') {\r\n let extension = null;\r\n const baseSrc = src.split('?')?.[0];\r\n const lastDot = baseSrc.lastIndexOf('.');\r\n if (lastDot > 0) {\r\n extension = baseSrc.substring(lastDot + 1);\r\n }\r\n flag = true;\r\n return {\r\n file: null,\r\n previewSrc: null,\r\n src,\r\n isPreviewImage: this.type === 'image',\r\n extension\r\n }\r\n }\r\n return src;\r\n });\r\n if (flag) {\r\n this.modelChange.emit(this.#model);\r\n }\r\n this.#modelChanges.next(this.#model);\r\n } else {\r\n this.#model = [];\r\n }\r\n }\r\n @Output() modelChange = new EventEmitter<PreviewFile[]>();\r\n @Output() sdChange = new EventEmitter<PreviewFile[]>();\r\n @ViewChildren('dropElement') dropElements: QueryList<ElementRef>;\r\n @ViewChild('canvas') canvas: ElementRef;\r\n @ContentChild(SdLabelDefDirective) sdLabelDef: SdLabelDefDirective;\r\n #subscription = new Subscription();\r\n #currentDropContainer: any;\r\n #srcChanges = new Subject();\r\n #modelChanges = new Subject();\r\n constructor(\r\n deviceService: DeviceDetectorService,\r\n private ref: ChangeDetectorRef,\r\n private notifyService: SdNotifyService,\r\n private translateService: SdTranslateService) {\r\n this.#isMobileOrTablet = !deviceService.isDesktop();\r\n }\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.#subscription.add(this.#srcChanges.pipe(startWith(this.#srcs)).subscribe(() => {\r\n if (!Array.isArray(this.#srcs)) {\r\n return;\r\n }\r\n const previewFiles = this.#srcs.map(src => {\r\n let extension = null;\r\n const baseSrc = src.split('?')?.[0];\r\n const lastDot = baseSrc.lastIndexOf('.');\r\n if (lastDot > 0) {\r\n extension = baseSrc.substring(lastDot + 1);\r\n }\r\n return {\r\n file: null,\r\n previewSrc: null,\r\n src,\r\n isPreviewImage: this.type === 'image',\r\n extension\r\n }\r\n });\r\n this.previewFiles = previewFiles;\r\n this.modelChange.emit(previewFiles);\r\n // this.sdChange.emit(previewFiles);\r\n }));\r\n this.#subscription.add(this.#modelChanges.pipe(startWith([])).subscribe(() => {\r\n if (Array.isArray(this.#model)) {\r\n this.previewFiles = this.#model;\r\n }\r\n }));\r\n if (!this.#isMobileOrTablet) {\r\n if (this.dropElements.length > 0) {\r\n const dropContainer = this.dropElements.first.nativeElement;\r\n this.#currentDropContainer = dropContainer;\r\n dropContainer.addEventListener('dragover', (evt: Event) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.9;\r\n dropContainer.style.border = '2px solid grey';\r\n });\r\n dropContainer.addEventListener('dragenter', (evt: Event) => {\r\n evt.preventDefault();\r\n });\r\n dropContainer.addEventListener('dragleave', (evt: Event) => {\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n });\r\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n await this.#uploadFile(evt.dataTransfer);\r\n });\r\n }\r\n this.#subscription.add(this.dropElements.changes.subscribe(() => {\r\n if (this.dropElements.length > 0 && this.#currentDropContainer !== this.dropElements.first.nativeElement) {\r\n const dropContainer = this.dropElements.first.nativeElement;\r\n this.#currentDropContainer = dropContainer;\r\n dropContainer.addEventListener('dragover', (evt: Event) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.9;\r\n dropContainer.style.border = '2px solid grey';\r\n });\r\n dropContainer.addEventListener('dragenter', (evt: Event) => {\r\n evt.preventDefault();\r\n });\r\n dropContainer.addEventListener('dragleave', (evt: Event) => {\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n });\r\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n await this.#uploadFile(evt.dataTransfer);\r\n });\r\n }\r\n }));\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n reload = (previewFiles: PreviewFile[]) => {\r\n if (Array.isArray(previewFiles)) {\r\n this.previewFiles = previewFiles;\r\n this.modelChange.emit(previewFiles);\r\n // this.sdChange.emit(previewFiles);\r\n }\r\n }\r\n\r\n #validate = async (file: File): Promise<string> => {\r\n if (this.type === 'image') {\r\n if (file.type.split('/')[0] !== 'image') {\r\n return `[${file.name}] ${this.translateService.translate('Uploaded file is not an image')}`;\r\n }\r\n }\r\n if (this.extensions?.length) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n if (!this.extensions.some(e => e.toUpperCase() === extension.toUpperCase())) {\r\n return `[${file.name}] ${this.translateService.translate('Uploaded file is not match extension')} ${this.extensions.join(', ')}`;\r\n }\r\n }\r\n if (this.maxSize) {\r\n if (this.maxSize * 1024 * 1024 < file.size) {\r\n return `[${file.name}] ${this.translateService.translate('Max file size')} ${this.maxSize} Mbs`;\r\n }\r\n }\r\n if (this.type === 'image' && (this.maxWidth || this.maxHeight)) {\r\n const message: string = await new Promise(resolve => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n if (this.maxWidth && img.width > this.maxWidth) {\r\n resolve(`[${file.name}] ${this.translateService.translate('Max image width')} ${this.maxWidth}px`);\r\n }\r\n if (this.maxHeight && img.height > this.maxHeight) {\r\n resolve(`[${file.name}] ${this.translateService.translate('Max image height')} ${this.maxHeight}px`);\r\n }\r\n resolve(null);\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n if (message) {\r\n return message;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n #preview = () => {\r\n for (const previewFile of this.previewFiles.filter(e => e.file)) {\r\n const reader = new FileReader();\r\n reader.onload = (evt) => {\r\n previewFile.previewSrc = evt.target.result;\r\n previewFile.isPreviewImage = previewFile.file?.type.split('/')[0] === 'image';\r\n this.ref.detectChanges();\r\n };\r\n reader.readAsDataURL(previewFile.file);\r\n }\r\n }\r\n\r\n onUpload = (previewFile?: PreviewFile) => {\r\n if ($(`#${this.id}`).length) {\r\n $('body').children(`#${this.id}`).remove();\r\n }\r\n if (previewFile || this.max === 1) {\r\n $('body').append(`<input id=\"${this.id}\" style=\"display: none\" type=\"file\" />`);\r\n } else {\r\n $('body').append(`<input id=\"${this.id}\" style=\"display: none\" type=\"file\" multiple />`);\r\n }\r\n $(`#${this.id}`).on('change', async (evt: any) => {\r\n await this.#uploadFile(evt.target, previewFile);\r\n $('body').children(`#${this.id}`).remove();\r\n });\r\n $(`#${this.id}`).trigger('click');\r\n }\r\n\r\n #uploadFile = async (target: DataTransfer, previewFile?: PreviewFile) => {\r\n if (!target.files.length) {\r\n return;\r\n }\r\n const originFiles = target.files;\r\n const files: File[] = [];\r\n if (!previewFile) {\r\n if (originFiles.length + this.previewFiles.length > this.max) {\r\n this.notifyService.notify.warning(`${this.translateService.translate('Max number of files')} ${this.max}`);\r\n return;\r\n }\r\n for (let i = 0; i < originFiles.length; i++) {\r\n let file = originFiles.item(i);\r\n if (this.type === 'image' && this.scaleToPixel > 0) {\r\n file = await this.#resize(file);\r\n }\r\n const message = await this.#validate(file);\r\n if (message) {\r\n this.notifyService.notify.warning(message);\r\n return;\r\n }\r\n files.push(file);\r\n }\r\n for (const file of files) {''\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n this.previewFiles.push({\r\n file,\r\n isPreviewImage: false,\r\n previewSrc: null,\r\n src: null,\r\n fileName: file.name,\r\n extension\r\n });\r\n }\r\n } else {\r\n const idx = this.previewFiles.indexOf(previewFile);\r\n let file = originFiles.item(0);\r\n if (this.type === 'image' && this.scaleToPixel > 0) {\r\n file = await this.#resize(file);\r\n }\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n this.previewFiles[idx] = {\r\n file,\r\n isPreviewImage: false,\r\n previewSrc: null,\r\n src: null,\r\n fileName: file.name,\r\n extension\r\n };\r\n }\r\n this.#preview();\r\n this.modelChange.emit(this.previewFiles);\r\n this.sdChange.emit(this.previewFiles);\r\n this.ref.detectChanges();\r\n }\r\n\r\n onRemove = (previewFile: PreviewFile) => {\r\n this.notifyService.confirmDelete().then(() => {\r\n const idx = this.previewFiles.indexOf(previewFile);\r\n this.previewFiles.splice(idx, 1);\r\n this.modelChange.emit(this.previewFiles);\r\n this.sdChange.emit(this.previewFiles);\r\n });\r\n }\r\n\r\n onDrop = (event: CdkDragDrop<string[]>) => {\r\n moveItemInArray(this.previewFiles, event.previousIndex, event.currentIndex);\r\n this.modelChange.emit(this.previewFiles);\r\n this.sdChange.emit(this.previewFiles);\r\n }\r\n\r\n #resize = async (file: File): Promise<File> => {\r\n if (!this.scaleToPixel) {\r\n return file;\r\n }\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n return file;\r\n }\r\n return await new Promise((resolve, reject) => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n try {\r\n if (img.width * img.height <= this.scaleToPixel) {\r\n return resolve(file);\r\n }\r\n const canvas1 = document.createElement('canvas');\r\n canvas1.setAttribute('id', this.#canvas1);\r\n const ctx1 = canvas1.getContext('2d');\r\n const { width, height } = this.#scale(img.width, img.height, this.scaleToPixel);\r\n canvas1.width = width;\r\n canvas1.height = height;\r\n\r\n const canvas2 = document.createElement('canvas');\r\n canvas2.setAttribute('id', this.#canvas2);\r\n const ctx2 = canvas2.getContext('2d');\r\n canvas2.width = width;\r\n canvas2.height = height;\r\n ctx2.drawImage(img, 0, 0, canvas2.width, canvas2.height);\r\n ctx2.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5);\r\n ctx1.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5, 0, 0, canvas1.width, canvas1.height);\r\n canvas1.toBlob(blob => {\r\n resolve(this.#blobToFile(blob, `${file.name.substring(0, lastDot)}.png`));\r\n });\r\n } catch (err) {\r\n reject(err);\r\n } finally {\r\n $(`#${this.#canvas1}`).remove();\r\n $(`#${this.#canvas2}`).remove();\r\n }\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n }\r\n\r\n #scale = (width: number, height: number, scaleToPixcel: number) => {\r\n if (!width || !height || !scaleToPixcel) {\r\n return {\r\n width,\r\n height\r\n };\r\n }\r\n const ratio = width / height;\r\n for (let i = 0; i < width; i++) {\r\n width -= i;\r\n height = Math.trunc(width / ratio);\r\n if (width * height <= scaleToPixcel) {\r\n break;\r\n }\r\n }\r\n return {\r\n width,\r\n height\r\n };\r\n }\r\n\r\n onSelect = (file: PreviewFile) => {\r\n if (!this.#isMobileOrTablet) {\r\n return;\r\n }\r\n if (this.selectedFile !== file) {\r\n this.selectedFile = file;\r\n } else {\r\n this.selectedFile = null;\r\n }\r\n }\r\n\r\n #blobToFile = (blob: Blob, fileName: string): File => {\r\n const temp: any = blob;\r\n temp.lastModifiedDate = new Date();\r\n temp.name = fileName;\r\n return blob as File;\r\n }\r\n}\r\n\r\nexport interface PreviewFile {\r\n file: File;\r\n src: string;\r\n previewSrc: string | ArrayBuffer;\r\n isPreviewImage: boolean;\r\n fileName?: string;\r\n extension?: string;\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DeviceDetectorModule } from 'ngx-device-detector';\r\nimport { SdUploadFile } from './upload-file.component';\r\nimport { SdNotifyModule } from '@sd-angular/core/notify';\r\nimport { SdTranslateModule } from '@sd-angular/core/translate';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { SdImagePreviewModule } from '@sd-angular/core/image-preview';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n DeviceDetectorModule.forRoot(),\r\n MatButtonModule,\r\n MatIconModule,\r\n DragDropModule,\r\n SdNotifyModule,\r\n SdTranslateModule,\r\n SdImagePreviewModule\r\n ],\r\n declarations: [\r\n SdUploadFile\r\n ],\r\n exports: [\r\n SdUploadFile\r\n ],\r\n providers: [\r\n ]\r\n})\r\nexport class SdUploadFileModule { }\r\n"]}
1
+ {"version":3,"sources":["../../../../node_modules/tslib/tslib.es6.js","../../../../projects/sd-core/upload-file/src/lib/upload-file.component.ts","../../../../projects/sd-core/upload-file/src/lib/upload-file.module.ts"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","this","n","v","op","TypeError","call","pop","length","push","Object","create","__values","o","s","m","i","__classPrivateFieldGet","receiver","state","kind","has","get","__classPrivateFieldSet","set","SdUploadFile","deviceService","ref","notifyService","translateService","_this","id","uuid.v4","_isMobileOrTablet","_canvas1","_canvas2","previewFiles","type","disabled","extensions","max","_srcs","previewWidth","previewHeight","align","_model","loaded","EventEmitter","modelChange","sdChange","_subscription","Subscription","_currentDropContainer","_srcChanges","Subject","_modelChanges","reload","Array","isArray","emit","_validate","file","split","name","translate","_a","lastDot","lastIndexOf","extension_1","substring","some","toUpperCase","join","maxSize","size","maxWidth","maxHeight","imageValidatorFn","URL","window","webkitURL","img","Image","onload","width","height","src","createObjectURL","message","_b","_preview","sum","previewFile","reader","FileReader","evt","previewSrc","target","isPreviewImage","detectChanges","filter","readAsDataURL","_c","_d","onUpload","$","children","remove","append","on","_uploadFile","trigger","files","originFiles","notify","warning","item","scaleToPixel","_resize","files_1","files_1_1","extension","fileName","idx","indexOf","onRemove","confirmDelete","splice","onDrop","event","moveItemInArray","previousIndex","currentIndex","canvas1","document","createElement","setAttribute","ctx1","getContext","_scale","canvas2","ctx2","drawImage","toBlob","blob","_blobToFile","err","scaleToPixcel","ratio","Math","trunc","onSelect","selectedFile","temp","lastModifiedDate","Date","isDesktop","defineProperty","prototype","srcs","model","flag_1","map","baseSrc","ngOnInit","ngAfterViewInit","add","pipe","startWith","subscribe","dropElements","dropContainer_1","first","nativeElement","addEventListener","preventDefault","style","opacity","border","dataTransfer","changes","dropContainer_2","ngOnDestroy","unsubscribe","Component","args","selector","template","DeviceDetectorService","ChangeDetectorRef","SdNotifyService","SdTranslateService","Input","Output","ViewChildren","ViewChild","ContentChild","SdLabelDefDirective","NgModule","imports","CommonModule","DeviceDetectorModule","forRoot","MatButtonModule","MatIconModule","DragDropModule","SdNotifyModule","SdTranslateModule","SdImagePreviewModule","declarations","exports","providers"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectorRef,\r\n AfterViewInit,\r\n ElementRef,\r\n OnInit,\r\n ViewChildren,\r\n QueryList,\r\n OnDestroy,\r\n ViewChild,\r\n ContentChild\r\n} from '@angular/core';\r\nimport { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { DeviceDetectorService } from 'ngx-device-detector';\r\nimport * as uuid from 'uuid';\r\nimport $ from 'jquery';\r\nimport { SdNotifyService } from '@sd-angular/core/notify';\r\nimport { SdTranslateService } from '@sd-angular/core/translate';\r\nimport { Subscription, Subject } from 'rxjs';\r\nimport { startWith } from 'rxjs/operators';\r\nimport { SdLabelDefDirective } from '@sd-angular/core/common';\r\n\r\n// https://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded\r\n@Component({\r\n selector: 'sd-upload-file',\r\n templateUrl: './upload-file.component.html',\r\n styleUrls: ['./upload-file.component.scss']\r\n})\r\nexport class SdUploadFile implements OnInit, AfterViewInit, OnDestroy {\r\n id = `I${uuid.v4()}`;\r\n #isMobileOrTablet = false;\r\n #canvas1 = `C${uuid.v4()}`;\r\n #canvas2 = `C${uuid.v4()}`;\r\n previewFiles: PreviewFile[] = [];\r\n selectedFile: PreviewFile;\r\n @Input() label: string;\r\n @Input() type: 'image' | 'file' = 'file';\r\n @Input() disabled = false;\r\n @Input() extensions: string[] = [];\r\n @Input() max = 1;\r\n @Input() maxSize: number;\r\n @Input() maxWidth: number;\r\n @Input() maxHeight: number;\r\n @Input() scaleToPixel: number;\r\n #srcs: string[];\r\n @Input() set srcs(srcs: string[]) {\r\n if (Array.isArray(srcs)) {\r\n this.#srcs = srcs;\r\n this.#srcChanges.next(this.#srcs);\r\n }\r\n }\r\n @Input() previewWidth: string = '100px';\r\n @Input() previewHeight: string = '100px';\r\n @Input() align: 'left' | 'center' = 'center';\r\n @Input() imageValidatorFn: (image: HTMLImageElement) => string;\r\n #model: PreviewFile[];\r\n @Input() set model(model: (string | PreviewFile)[]) {\r\n if (Array.isArray(model) && this.#model !== model) {\r\n let flag = false;\r\n this.#model = model.map(src => {\r\n if (typeof (src) === 'string') {\r\n let extension = null;\r\n const baseSrc = src.split('?')?.[0];\r\n const lastDot = baseSrc.lastIndexOf('.');\r\n if (lastDot > 0) {\r\n extension = baseSrc.substring(lastDot + 1);\r\n }\r\n flag = true;\r\n return {\r\n file: null,\r\n previewSrc: null,\r\n src,\r\n isPreviewImage: this.type === 'image',\r\n extension\r\n }\r\n }\r\n return src;\r\n });\r\n if (flag) {\r\n this.modelChange.emit(this.#model);\r\n }\r\n this.#modelChanges.next(this.#model);\r\n } else {\r\n this.#model = [];\r\n }\r\n }\r\n @Output() loaded = new EventEmitter<PreviewFile[]>();\r\n @Output() modelChange = new EventEmitter<PreviewFile[]>();\r\n @Output() sdChange = new EventEmitter<PreviewFile[]>();\r\n @ViewChildren('dropElement') dropElements: QueryList<ElementRef>;\r\n @ViewChild('canvas') canvas: ElementRef;\r\n @ContentChild(SdLabelDefDirective) sdLabelDef: SdLabelDefDirective;\r\n #subscription = new Subscription();\r\n #currentDropContainer: any;\r\n #srcChanges = new Subject();\r\n #modelChanges = new Subject();\r\n constructor(\r\n deviceService: DeviceDetectorService,\r\n private ref: ChangeDetectorRef,\r\n private notifyService: SdNotifyService,\r\n private translateService: SdTranslateService) {\r\n this.#isMobileOrTablet = !deviceService.isDesktop();\r\n }\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.#subscription.add(this.#srcChanges.pipe(startWith(this.#srcs)).subscribe(() => {\r\n if (!Array.isArray(this.#srcs)) {\r\n return;\r\n }\r\n const previewFiles = this.#srcs.map(src => {\r\n let extension = null;\r\n const baseSrc = src.split('?')?.[0];\r\n const lastDot = baseSrc.lastIndexOf('.');\r\n if (lastDot > 0) {\r\n extension = baseSrc.substring(lastDot + 1);\r\n }\r\n return {\r\n file: null,\r\n previewSrc: null,\r\n src,\r\n isPreviewImage: this.type === 'image',\r\n extension\r\n }\r\n });\r\n this.previewFiles = previewFiles;\r\n this.modelChange.emit(previewFiles);\r\n // this.sdChange.emit(previewFiles);\r\n }));\r\n this.#subscription.add(this.#modelChanges.pipe(startWith([])).subscribe(() => {\r\n if (Array.isArray(this.#model)) {\r\n this.previewFiles = this.#model;\r\n }\r\n }));\r\n if (!this.#isMobileOrTablet) {\r\n if (this.dropElements.length > 0) {\r\n const dropContainer = this.dropElements.first.nativeElement;\r\n this.#currentDropContainer = dropContainer;\r\n dropContainer.addEventListener('dragover', (evt: Event) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.9;\r\n dropContainer.style.border = '2px solid grey';\r\n });\r\n dropContainer.addEventListener('dragenter', (evt: Event) => {\r\n evt.preventDefault();\r\n });\r\n dropContainer.addEventListener('dragleave', (evt: Event) => {\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n });\r\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n await this.#uploadFile(evt.dataTransfer);\r\n });\r\n }\r\n this.#subscription.add(this.dropElements.changes.subscribe(() => {\r\n if (this.dropElements.length > 0 && this.#currentDropContainer !== this.dropElements.first.nativeElement) {\r\n const dropContainer = this.dropElements.first.nativeElement;\r\n this.#currentDropContainer = dropContainer;\r\n dropContainer.addEventListener('dragover', (evt: Event) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.9;\r\n dropContainer.style.border = '2px solid grey';\r\n });\r\n dropContainer.addEventListener('dragenter', (evt: Event) => {\r\n evt.preventDefault();\r\n });\r\n dropContainer.addEventListener('dragleave', (evt: Event) => {\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n });\r\n dropContainer.addEventListener('drop', async (evt: DragEvent) => {\r\n evt.preventDefault();\r\n dropContainer.style.opacity = 0.6;\r\n dropContainer.style.border = '2px dashed grey';\r\n await this.#uploadFile(evt.dataTransfer);\r\n });\r\n }\r\n }));\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n reload = (previewFiles: PreviewFile[]) => {\r\n if (Array.isArray(previewFiles)) {\r\n this.previewFiles = previewFiles;\r\n this.modelChange.emit(previewFiles);\r\n // this.sdChange.emit(previewFiles);\r\n }\r\n }\r\n\r\n #validate = async (file: File): Promise<string> => {\r\n if (this.type === 'image') {\r\n if (file.type.split('/')[0] !== 'image') {\r\n return `[${file.name}] ${this.translateService.translate('Uploaded file is not an image')}`;\r\n }\r\n }\r\n if (this.extensions?.length) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n if (!this.extensions.some(e => e.toUpperCase() === extension.toUpperCase())) {\r\n return `[${file.name}] ${this.translateService.translate('Uploaded file is not match extension')} ${this.extensions.join(', ')}`;\r\n }\r\n }\r\n if (this.maxSize) {\r\n if (this.maxSize * 1024 * 1024 < file.size) {\r\n return `[${file.name}] ${this.translateService.translate('Max file size')} ${this.maxSize} Mbs`;\r\n }\r\n }\r\n if (this.type === 'image' && (this.maxWidth || this.maxHeight || this.imageValidatorFn)) {\r\n const message: string = await new Promise(resolve => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n if (this.maxWidth && img.width > this.maxWidth) {\r\n resolve(`[${file.name}] ${this.translateService.translate('Max image width')} ${this.maxWidth}px`);\r\n return;\r\n }\r\n if (this.maxHeight && img.height > this.maxHeight) {\r\n resolve(`[${file.name}] ${this.translateService.translate('Max image height')} ${this.maxHeight}px`);\r\n return;\r\n }\r\n if (this.imageValidatorFn) {\r\n resolve(this.imageValidatorFn(img))\r\n return;\r\n }\r\n resolve(null);\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n if (message) {\r\n return message;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n #preview = () => {\r\n let sum = 0;\r\n for (const previewFile of this.previewFiles.filter(e => e.file)) {\r\n const reader = new FileReader();\r\n reader.onload = (evt) => {\r\n previewFile.previewSrc = evt.target.result;\r\n previewFile.isPreviewImage = previewFile.file?.type.split('/')[0] === 'image';\r\n this.ref.detectChanges();\r\n sum++;\r\n if (sum === this.previewFiles.filter(e => e.file).length) this.loaded.emit(this.previewFiles)\r\n }\r\n reader.readAsDataURL(previewFile.file);\r\n }\r\n }\r\n\r\n onUpload = (previewFile?: PreviewFile) => {\r\n if ($(`#${this.id}`).length) {\r\n $('body').children(`#${this.id}`).remove();\r\n }\r\n if (previewFile || this.max === 1) {\r\n $('body').append(`<input id=\"${this.id}\" style=\"display: none\" type=\"file\" />`);\r\n } else {\r\n $('body').append(`<input id=\"${this.id}\" style=\"display: none\" type=\"file\" multiple />`);\r\n }\r\n $(`#${this.id}`).on('change', async (evt: any) => {\r\n await this.#uploadFile(evt.target, previewFile);\r\n $('body').children(`#${this.id}`).remove();\r\n });\r\n $(`#${this.id}`).trigger('click');\r\n }\r\n\r\n #uploadFile = async (target: DataTransfer, previewFile?: PreviewFile) => {\r\n if (!target.files.length) {\r\n return;\r\n }\r\n const originFiles = target.files;\r\n const files: File[] = [];\r\n if (!previewFile) {\r\n if (originFiles.length + this.previewFiles.length > this.max) {\r\n this.notifyService.notify.warning(`${this.translateService.translate('Max number of files')} ${this.max}`);\r\n return;\r\n }\r\n for (let i = 0; i < originFiles.length; i++) {\r\n let file = originFiles.item(i);\r\n if (this.type === 'image' && this.scaleToPixel > 0) {\r\n file = await this.#resize(file);\r\n }\r\n const message = await this.#validate(file);\r\n if (message) {\r\n this.notifyService.notify.warning(message);\r\n return;\r\n }\r\n files.push(file);\r\n }\r\n for (const file of files) {\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n this.previewFiles.push({\r\n file,\r\n isPreviewImage: false,\r\n previewSrc: null,\r\n src: null,\r\n fileName: file.name,\r\n extension\r\n });\r\n }\r\n } else {\r\n const idx = this.previewFiles.indexOf(previewFile);\r\n let file = originFiles.item(0);\r\n if (this.type === 'image' && this.scaleToPixel > 0) {\r\n file = await this.#resize(file);\r\n }\r\n const lastDot = file.name.lastIndexOf('.');\r\n const extension = file.name.substring(lastDot + 1);\r\n this.previewFiles[idx] = {\r\n file,\r\n isPreviewImage: false,\r\n previewSrc: null,\r\n src: null,\r\n fileName: file.name,\r\n extension\r\n };\r\n }\r\n this.#preview();\r\n this.modelChange.emit(this.previewFiles);\r\n this.sdChange.emit(this.previewFiles);\r\n this.ref.detectChanges();\r\n }\r\n\r\n onRemove = (previewFile: PreviewFile) => {\r\n this.notifyService.confirmDelete().then(() => {\r\n const idx = this.previewFiles.indexOf(previewFile);\r\n this.previewFiles.splice(idx, 1);\r\n this.modelChange.emit(this.previewFiles);\r\n this.sdChange.emit(this.previewFiles);\r\n });\r\n }\r\n\r\n onDrop = (event: CdkDragDrop<string[]>) => {\r\n moveItemInArray(this.previewFiles, event.previousIndex, event.currentIndex);\r\n this.modelChange.emit(this.previewFiles);\r\n this.sdChange.emit(this.previewFiles);\r\n }\r\n\r\n #resize = async (file: File): Promise<File> => {\r\n if (!this.scaleToPixel) {\r\n return file;\r\n }\r\n const lastDot = file.name.lastIndexOf('.');\r\n if (lastDot === -1) {\r\n return file;\r\n }\r\n return await new Promise((resolve, reject) => {\r\n const URL = window.URL || window.webkitURL;\r\n const img = new Image();\r\n img.onload = () => {\r\n try {\r\n if (img.width * img.height <= this.scaleToPixel) {\r\n return resolve(file);\r\n }\r\n const canvas1 = document.createElement('canvas');\r\n canvas1.setAttribute('id', this.#canvas1);\r\n const ctx1 = canvas1.getContext('2d');\r\n const { width, height } = this.#scale(img.width, img.height, this.scaleToPixel);\r\n canvas1.width = width;\r\n canvas1.height = height;\r\n\r\n const canvas2 = document.createElement('canvas');\r\n canvas2.setAttribute('id', this.#canvas2);\r\n const ctx2 = canvas2.getContext('2d');\r\n canvas2.width = width;\r\n canvas2.height = height;\r\n ctx2.drawImage(img, 0, 0, canvas2.width, canvas2.height);\r\n ctx2.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5);\r\n ctx1.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5, 0, 0, canvas1.width, canvas1.height);\r\n canvas1.toBlob(blob => {\r\n resolve(this.#blobToFile(blob, `${file.name.substring(0, lastDot)}.png`));\r\n });\r\n } catch (err) {\r\n reject(err);\r\n } finally {\r\n $(`#${this.#canvas1}`).remove();\r\n $(`#${this.#canvas2}`).remove();\r\n }\r\n };\r\n img.src = URL.createObjectURL(file);\r\n });\r\n }\r\n\r\n #scale = (width: number, height: number, scaleToPixcel: number) => {\r\n if (!width || !height || !scaleToPixcel) {\r\n return {\r\n width,\r\n height\r\n };\r\n }\r\n const ratio = width / height;\r\n for (let i = 0; i < width; i++) {\r\n width -= i;\r\n height = Math.trunc(width / ratio);\r\n if (width * height <= scaleToPixcel) {\r\n break;\r\n }\r\n }\r\n return {\r\n width,\r\n height\r\n };\r\n }\r\n\r\n onSelect = (file: PreviewFile) => {\r\n if (!this.#isMobileOrTablet) {\r\n return;\r\n }\r\n if (this.selectedFile !== file) {\r\n this.selectedFile = file;\r\n } else {\r\n this.selectedFile = null;\r\n }\r\n }\r\n\r\n #blobToFile = (blob: Blob, fileName: string): File => {\r\n const temp: any = blob;\r\n temp.lastModifiedDate = new Date();\r\n temp.name = fileName;\r\n return blob as File;\r\n }\r\n}\r\n\r\nexport interface PreviewFile {\r\n file: File;\r\n src: string;\r\n previewSrc: string | ArrayBuffer;\r\n isPreviewImage: boolean;\r\n fileName?: string;\r\n extension?: string;\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DeviceDetectorModule } from 'ngx-device-detector';\r\nimport { SdUploadFile } from './upload-file.component';\r\nimport { SdNotifyModule } from '@sd-angular/core/notify';\r\nimport { SdTranslateModule } from '@sd-angular/core/translate';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { SdImagePreviewModule } from '@sd-angular/core/image-preview';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n DeviceDetectorModule.forRoot(),\r\n MatButtonModule,\r\n MatIconModule,\r\n DragDropModule,\r\n SdNotifyModule,\r\n SdTranslateModule,\r\n SdImagePreviewModule\r\n ],\r\n declarations: [\r\n SdUploadFile\r\n ],\r\n exports: [\r\n SdUploadFile\r\n ],\r\n providers: [\r\n ]\r\n})\r\nexport class SdUploadFileModule { }\r\n"]}
@@ -30,6 +30,7 @@ export class SdUploadFile {
30
30
  this.previewHeight = '100px';
31
31
  this.align = 'center';
32
32
  _model.set(this, void 0);
33
+ this.loaded = new EventEmitter();
33
34
  this.modelChange = new EventEmitter();
34
35
  this.sdChange = new EventEmitter();
35
36
  _subscription.set(this, new Subscription());
@@ -62,16 +63,22 @@ export class SdUploadFile {
62
63
  return `[${file.name}] ${this.translateService.translate('Max file size')} ${this.maxSize} Mbs`;
63
64
  }
64
65
  }
65
- if (this.type === 'image' && (this.maxWidth || this.maxHeight)) {
66
+ if (this.type === 'image' && (this.maxWidth || this.maxHeight || this.imageValidatorFn)) {
66
67
  const message = yield new Promise(resolve => {
67
68
  const URL = window.URL || window.webkitURL;
68
69
  const img = new Image();
69
70
  img.onload = () => {
70
71
  if (this.maxWidth && img.width > this.maxWidth) {
71
72
  resolve(`[${file.name}] ${this.translateService.translate('Max image width')} ${this.maxWidth}px`);
73
+ return;
72
74
  }
73
75
  if (this.maxHeight && img.height > this.maxHeight) {
74
76
  resolve(`[${file.name}] ${this.translateService.translate('Max image height')} ${this.maxHeight}px`);
77
+ return;
78
+ }
79
+ if (this.imageValidatorFn) {
80
+ resolve(this.imageValidatorFn(img));
81
+ return;
75
82
  }
76
83
  resolve(null);
77
84
  };
@@ -84,6 +91,7 @@ export class SdUploadFile {
84
91
  return null;
85
92
  }));
86
93
  _preview.set(this, () => {
94
+ let sum = 0;
87
95
  for (const previewFile of this.previewFiles.filter(e => e.file)) {
88
96
  const reader = new FileReader();
89
97
  reader.onload = (evt) => {
@@ -91,6 +99,9 @@ export class SdUploadFile {
91
99
  previewFile.previewSrc = evt.target.result;
92
100
  previewFile.isPreviewImage = ((_a = previewFile.file) === null || _a === void 0 ? void 0 : _a.type.split('/')[0]) === 'image';
93
101
  this.ref.detectChanges();
102
+ sum++;
103
+ if (sum === this.previewFiles.filter(e => e.file).length)
104
+ this.loaded.emit(this.previewFiles);
94
105
  };
95
106
  reader.readAsDataURL(previewFile.file);
96
107
  }
@@ -135,7 +146,6 @@ export class SdUploadFile {
135
146
  files.push(file);
136
147
  }
137
148
  for (const file of files) {
138
- '';
139
149
  const lastDot = file.name.lastIndexOf('.');
140
150
  const extension = file.name.substring(lastDot + 1);
141
151
  this.previewFiles.push({
@@ -418,11 +428,13 @@ SdUploadFile.propDecorators = {
418
428
  previewWidth: [{ type: Input }],
419
429
  previewHeight: [{ type: Input }],
420
430
  align: [{ type: Input }],
431
+ imageValidatorFn: [{ type: Input }],
421
432
  model: [{ type: Input }],
433
+ loaded: [{ type: Output }],
422
434
  modelChange: [{ type: Output }],
423
435
  sdChange: [{ type: Output }],
424
436
  dropElements: [{ type: ViewChildren, args: ['dropElement',] }],
425
437
  canvas: [{ type: ViewChild, args: ['canvas',] }],
426
438
  sdLabelDef: [{ type: ContentChild, args: [SdLabelDefDirective,] }]
427
439
  };
428
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkM6L1VzZXJzL25naGlhdHQxNV9vbmVtb3VudC9Eb2N1bWVudHMvbGliLWNvcmUtdWkvcHJvamVjdHMvc2QtY29yZS91cGxvYWQtZmlsZS8iLCJzb3VyY2VzIjpbInNyYy9saWIvdXBsb2FkLWZpbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsRUFJakIsWUFBWSxFQUdaLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlELHFGQUFxRjtBQU1yRixNQUFNLE9BQU8sWUFBWTtJQWtFdkIsWUFDRSxhQUFvQyxFQUM1QixHQUFzQixFQUN0QixhQUE4QixFQUM5QixnQkFBb0M7UUFGcEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQWlCO1FBQzlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUFyRTlDLE9BQUUsR0FB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R0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUMzQyxDQUFDLENBQUEsQ0FBQyxDQUFDO2lCQUNKO1lBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNMO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCw0Q0FBbUIsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQzs7OztZQXBLRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtnQkFDMUIsOGtJQUEyQzs7YUFFNUM7OztZQWRRLHFCQUFxQjtZQVg1QixpQkFBaUI7WUFjVixlQUFlO1lBQ2Ysa0JBQWtCOzs7b0JBa0J4QixLQUFLO21CQUNMLEtBQUs7dUJBQ0wsS0FBSzt5QkFDTCxLQUFLO2tCQUNMLEtBQUs7c0JBQ0wsS0FBSzt1QkFDTCxLQUFLO3dCQUNMLEtBQUs7MkJBQ0wsS0FBSzttQkFFTCxLQUFLOzJCQU1MLEtBQUs7NEJBQ0wsS0FBSztvQkFDTCxLQUFLO29CQUVMLEtBQUs7MEJBOEJMLE1BQU07dUJBQ04sTUFBTTsyQkFDTixZQUFZLFNBQUMsYUFBYTtxQkFDMUIsU0FBUyxTQUFDLFFBQVE7eUJBQ2xCLFlBQVksU0FBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgRWxlbWVudFJlZixcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgVmlld0NoaWxkLFxyXG4gIENvbnRlbnRDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcbmltcG9ydCB7IERldmljZURldGVjdG9yU2VydmljZSB9IGZyb20gJ25neC1kZXZpY2UtZGV0ZWN0b3InO1xyXG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xyXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xyXG5pbXBvcnQgeyBTZE5vdGlmeVNlcnZpY2UgfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL25vdGlmeSc7XHJcbmltcG9ydCB7IFNkVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BzZC1hbmd1bGFyL2NvcmUvdHJhbnNsYXRlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU2RMYWJlbERlZkRpcmVjdGl2ZSB9IGZyb20gJ0BzZC1hbmd1bGFyL2NvcmUvY29tbW9uJztcclxuXHJcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ0NTkzNzkvcHJldmlldy1hbi1pbWFnZS1iZWZvcmUtaXQtaXMtdXBsb2FkZWRcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZC11cGxvYWQtZmlsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VwbG9hZC1maWxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi91cGxvYWQtZmlsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZFVwbG9hZEZpbGUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgaWQgPSBgSSR7dXVpZC52NCgpfWA7XHJcbiAgI2lzTW9iaWxlT3JUYWJsZXQgPSBmYWxzZTtcclxuICAjY2FudmFzMSA9IGBDJHt1dWlkLnY0KCl9YDtcclxuICAjY2FudmFzMiA9IGBDJHt1dWlkLnY0KCl9YDtcclxuICBwcmV2aWV3RmlsZXM6IFByZXZpZXdGaWxlW10gPSBbXTtcclxuICBzZWxlY3RlZEZpbGU6IFByZXZpZXdGaWxlO1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdHlwZTogJ2ltYWdlJyB8ICdmaWxlJyA9ICdmaWxlJztcclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGV4dGVuc2lvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgQElucHV0KCkgbWF4ID0gMTtcclxuICBASW5wdXQoKSBtYXhTaXplOiBudW1iZXI7XHJcbiAgQElucHV0KCkgbWF4V2lkdGg6IG51bWJlcjtcclxuICBASW5wdXQoKSBtYXhIZWlnaHQ6IG51bWJlcjtcclxuICBASW5wdXQoKSBzY2FsZVRvUGl4ZWw6IG51bWJlcjtcclxuICAjc3Jjczogc3RyaW5nW107XHJcbiAgQElucHV0KCkgc2V0IHNyY3Moc3Jjczogc3RyaW5nW10pIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHNyY3MpKSB7XHJcbiAgICAgIHRoaXMuI3NyY3MgPSBzcmNzO1xyXG4gICAgICB0aGlzLiNzcmNDaGFuZ2VzLm5leHQodGhpcy4jc3Jjcyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHByZXZpZXdXaWR0aDogc3RyaW5nID0gJzEwMHB4JztcclxuICBASW5wdXQoKSBwcmV2aWV3SGVpZ2h0OiBzdHJpbmcgPSAnMTAwcHgnO1xyXG4gIEBJbnB1dCgpIGFsaWduOiAnbGVmdCcgfCAnY2VudGVyJyA9ICdjZW50ZXInO1xyXG4gICNtb2RlbDogUHJldmlld0ZpbGVbXTtcclxuICBASW5wdXQoKSBzZXQgbW9kZWwobW9kZWw6IChzdHJpbmcgfCBQcmV2aWV3RmlsZSlbXSkge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWwpICYmIHRoaXMuI21vZGVsICE9PSBtb2RlbCkge1xyXG4gICAgICBsZXQgZmxhZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLiNtb2RlbCA9IG1vZGVsLm1hcChzcmMgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgKHNyYykgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBsZXQgZXh0ZW5zaW9uID0gbnVsbDtcclxuICAgICAgICAgIGNvbnN0IGJhc2VTcmMgPSBzcmMuc3BsaXQoJz8nKT8uWzBdO1xyXG4gICAgICAgICAgY29uc3QgbGFzdERvdCA9IGJhc2VTcmMubGFzdEluZGV4T2YoJy4nKTtcclxuICAgICAgICAgIGlmIChsYXN0RG90ID4gMCkge1xyXG4gICAgICAgICAgICBleHRlbnNpb24gPSBiYXNlU3JjLnN1YnN0cmluZyhsYXN0RG90ICsgMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmbGFnID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZpbGU6IG51bGwsXHJcbiAgICAgICAgICAgIHByZXZpZXdTcmM6IG51bGwsXHJcbiAgICAgICAgICAgIHNyYyxcclxuICAgICAgICAgICAgaXNQcmV2aWV3SW1hZ2U6IHRoaXMudHlwZSA9PT0gJ2ltYWdlJyxcclxuICAgICAgICAgICAgZXh0ZW5zaW9uXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzcmM7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoZmxhZykge1xyXG4gICAgICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh0aGlzLiNtb2RlbCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy4jbW9kZWxDaGFuZ2VzLm5leHQodGhpcy4jbW9kZWwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy4jbW9kZWwgPSBbXTtcclxuICAgIH1cclxuICB9XHJcbiAgQE91dHB1dCgpIG1vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcmV2aWV3RmlsZVtdPigpO1xyXG4gIEBPdXRwdXQoKSBzZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UHJldmlld0ZpbGVbXT4oKTtcclxuICBAVmlld0NoaWxkcmVuKCdkcm9wRWxlbWVudCcpIGRyb3BFbGVtZW50czogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycpIGNhbnZhczogRWxlbWVudFJlZjtcclxuICBAQ29udGVudENoaWxkKFNkTGFiZWxEZWZEaXJlY3RpdmUpIHNkTGFiZWxEZWY6IFNkTGFiZWxEZWZEaXJlY3RpdmU7XHJcbiAgI3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAjY3VycmVudERyb3BDb250YWluZXI6IGFueTtcclxuICAjc3JjQ2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgI21vZGVsQ2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBkZXZpY2VTZXJ2aWNlOiBEZXZpY2VEZXRlY3RvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIG5vdGlmeVNlcnZpY2U6IFNkTm90aWZ5U2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogU2RUcmFuc2xhdGVTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLiNpc01vYmlsZU9yVGFibGV0ID0gIWRldmljZVNlcnZpY2UuaXNEZXNrdG9wKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuI3NyY0NoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy4jc3JjcykpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLiNzcmNzKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwcmV2aWV3RmlsZXMgPSB0aGlzLiNzcmNzLm1hcChzcmMgPT4ge1xyXG4gICAgICAgIGxldCBleHRlbnNpb24gPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGJhc2VTcmMgPSBzcmMuc3BsaXQoJz8nKT8uWzBdO1xyXG4gICAgICAgIGNvbnN0IGxhc3REb3QgPSBiYXNlU3JjLmxhc3RJbmRleE9mKCcuJyk7XHJcbiAgICAgICAgaWYgKGxhc3REb3QgPiAwKSB7XHJcbiAgICAgICAgICBleHRlbnNpb24gPSBiYXNlU3JjLnN1YnN0cmluZyhsYXN0RG90ICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBmaWxlOiBudWxsLFxyXG4gICAgICAgICAgcHJldmlld1NyYzogbnVsbCxcclxuICAgICAgICAgIHNyYyxcclxuICAgICAgICAgIGlzUHJldmlld0ltYWdlOiB0aGlzLnR5cGUgPT09ICdpbWFnZScsXHJcbiAgICAgICAgICBleHRlbnNpb25cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnByZXZpZXdGaWxlcyA9IHByZXZpZXdGaWxlcztcclxuICAgICAgdGhpcy5tb2RlbENoYW5nZS5lbWl0KHByZXZpZXdGaWxlcyk7XHJcbiAgICAgIC8vIHRoaXMuc2RDaGFuZ2UuZW1pdChwcmV2aWV3RmlsZXMpO1xyXG4gICAgfSkpO1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLmFkZCh0aGlzLiNtb2RlbENoYW5nZXMucGlwZShzdGFydFdpdGgoW10pKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLiNtb2RlbCkpIHtcclxuICAgICAgICB0aGlzLnByZXZpZXdGaWxlcyA9IHRoaXMuI21vZGVsO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgICBpZiAoIXRoaXMuI2lzTW9iaWxlT3JUYWJsZXQpIHtcclxuICAgICAgaWYgKHRoaXMuZHJvcEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBkcm9wQ29udGFpbmVyID0gdGhpcy5kcm9wRWxlbWVudHMuZmlyc3QubmF0aXZlRWxlbWVudDtcclxuICAgICAgICB0aGlzLiNjdXJyZW50RHJvcENvbnRhaW5lciA9IGRyb3BDb250YWluZXI7XHJcbiAgICAgICAgZHJvcENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIChldnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIGRyb3BDb250YWluZXIuc3R5bGUub3BhY2l0eSA9IDAuOTtcclxuICAgICAgICAgIGRyb3BDb250YWluZXIuc3R5bGUuYm9yZGVyID0gJzJweCBzb2xpZCBncmV5JztcclxuICAgICAgICB9KTtcclxuICAgICAgICBkcm9wQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIChldnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBkcm9wQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIChldnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBkcm9wQ29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSAwLjY7XHJcbiAgICAgICAgICBkcm9wQ29udGFpbmVyLnN0eWxlLmJvcmRlciA9ICcycHggZGFzaGVkIGdyZXknO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRyb3BDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGFzeW5jIChldnQ6IERyYWdFdmVudCkgPT4ge1xyXG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICBkcm9wQ29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSAwLjY7XHJcbiAgICAgICAgICBkcm9wQ29udGFpbmVyLnN0eWxlLmJvcmRlciA9ICcycHggZGFzaGVkIGdyZXknO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy4jdXBsb2FkRmlsZShldnQuZGF0YVRyYW5zZmVyKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuZHJvcEVsZW1lbnRzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5kcm9wRWxlbWVudHMubGVuZ3RoID4gMCAmJiB0aGlzLiNjdXJyZW50RHJvcENvbnRhaW5lciAhPT0gdGhpcy5kcm9wRWxlbWVudHMuZmlyc3QubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgY29uc3QgZHJvcENvbnRhaW5lciA9IHRoaXMuZHJvcEVsZW1lbnRzLmZpcnN0Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICB0aGlzLiNjdXJyZW50RHJvcENvbnRhaW5lciA9IGRyb3BDb250YWluZXI7XHJcbiAgICAgICAgICBkcm9wQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGRyb3BDb250YWluZXIuc3R5bGUub3BhY2l0eSA9IDAuOTtcclxuICAgICAgICAgICAgZHJvcENvbnRhaW5lci5zdHlsZS5ib3JkZXIgPSAnMnB4IHNvbGlkIGdyZXknO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBkcm9wQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIChldnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBkcm9wQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIChldnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGRyb3BDb250YWluZXIuc3R5bGUub3BhY2l0eSA9IDAuNjtcclxuICAgICAgICAgICAgZHJvcENvbnRhaW5lci5zdHlsZS5ib3JkZXIgPSAnMnB4IGRhc2hlZCBncmV5JztcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZHJvcENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgYXN5bmMgKGV2dDogRHJhZ0V2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBkcm9wQ29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSAwLjY7XHJcbiAgICAgICAgICAgIGRyb3BDb250YWluZXIuc3R5bGUuYm9yZGVyID0gJzJweCBkYXNoZWQgZ3JleSc7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3VwbG9hZEZpbGUoZXZ0LmRhdGFUcmFuc2Zlcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy4jc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICByZWxvYWQgPSAocHJldmlld0ZpbGVzOiBQcmV2aWV3RmlsZVtdKSA9PiB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcmV2aWV3RmlsZXMpKSB7XHJcbiAgICAgIHRoaXMucHJldmlld0ZpbGVzID0gcHJldmlld0ZpbGVzO1xyXG4gICAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQocHJldmlld0ZpbGVzKTtcclxuICAgICAgLy8gdGhpcy5zZENoYW5nZS5lbWl0KHByZXZpZXdGaWxlcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjdmFsaWRhdGUgPSBhc3luYyAoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgICBpZiAodGhpcy50eXBlID09PSAnaW1hZ2UnKSB7XHJcbiAgICAgIGlmIChmaWxlLnR5cGUuc3BsaXQoJy8nKVswXSAhPT0gJ2ltYWdlJykge1xyXG4gICAgICAgIHJldHVybiBgWyR7ZmlsZS5uYW1lfV0gJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdVcGxvYWRlZCBmaWxlIGlzIG5vdCBhbiBpbWFnZScpfWA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmV4dGVuc2lvbnM/Lmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBsYXN0RG90ID0gZmlsZS5uYW1lLmxhc3RJbmRleE9mKCcuJyk7XHJcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbGUubmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpO1xyXG4gICAgICBpZiAoIXRoaXMuZXh0ZW5zaW9ucy5zb21lKGUgPT4gZS50b1VwcGVyQ2FzZSgpID09PSBleHRlbnNpb24udG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICByZXR1cm4gYFske2ZpbGUubmFtZX1dICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnVXBsb2FkZWQgZmlsZSBpcyBub3QgbWF0Y2ggZXh0ZW5zaW9uJyl9ICR7dGhpcy5leHRlbnNpb25zLmpvaW4oJywgJyl9YDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubWF4U2l6ZSkge1xyXG4gICAgICBpZiAodGhpcy5tYXhTaXplICogMTAyNCAqIDEwMjQgPCBmaWxlLnNpemUpIHtcclxuICAgICAgICByZXR1cm4gYFske2ZpbGUubmFtZX1dICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnTWF4IGZpbGUgc2l6ZScpfSAke3RoaXMubWF4U2l6ZX0gTWJzYDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2ltYWdlJyAmJiAodGhpcy5tYXhXaWR0aCB8fCB0aGlzLm1heEhlaWdodCkpIHtcclxuICAgICAgY29uc3QgbWVzc2FnZTogc3RyaW5nID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29uc3QgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMO1xyXG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5tYXhXaWR0aCAmJiBpbWcud2lkdGggPiB0aGlzLm1heFdpZHRoKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoYFske2ZpbGUubmFtZX1dICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnTWF4IGltYWdlIHdpZHRoJyl9ICR7dGhpcy5tYXhXaWR0aH1weGApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMubWF4SGVpZ2h0ICYmIGltZy5oZWlnaHQgPiB0aGlzLm1heEhlaWdodCkge1xyXG4gICAgICAgICAgICByZXNvbHZlKGBbJHtmaWxlLm5hbWV9XSAke3RoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ01heCBpbWFnZSBoZWlnaHQnKX0gJHt0aGlzLm1heEhlaWdodH1weGApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGltZy5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAjcHJldmlldyA9ICgpID0+IHtcclxuICAgIGZvciAoY29uc3QgcHJldmlld0ZpbGUgb2YgdGhpcy5wcmV2aWV3RmlsZXMuZmlsdGVyKGUgPT4gZS5maWxlKSkge1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIub25sb2FkID0gKGV2dCkgPT4ge1xyXG4gICAgICAgIHByZXZpZXdGaWxlLnByZXZpZXdTcmMgPSBldnQudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgICBwcmV2aWV3RmlsZS5pc1ByZXZpZXdJbWFnZSA9IHByZXZpZXdGaWxlLmZpbGU/LnR5cGUuc3BsaXQoJy8nKVswXSA9PT0gJ2ltYWdlJztcclxuICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH07XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHByZXZpZXdGaWxlLmZpbGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25VcGxvYWQgPSAocHJldmlld0ZpbGU/OiBQcmV2aWV3RmlsZSkgPT4ge1xyXG4gICAgaWYgKCQoYCMke3RoaXMuaWR9YCkubGVuZ3RoKSB7XHJcbiAgICAgICQoJ2JvZHknKS5jaGlsZHJlbihgIyR7dGhpcy5pZH1gKS5yZW1vdmUoKTtcclxuICAgIH1cclxuICAgIGlmIChwcmV2aWV3RmlsZSB8fCB0aGlzLm1heCA9PT0gMSkge1xyXG4gICAgICAkKCdib2R5JykuYXBwZW5kKGA8aW5wdXQgaWQ9XCIke3RoaXMuaWR9XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCIgdHlwZT1cImZpbGVcIiAvPmApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgJCgnYm9keScpLmFwcGVuZChgPGlucHV0IGlkPVwiJHt0aGlzLmlkfVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiIHR5cGU9XCJmaWxlXCIgbXVsdGlwbGUgLz5gKTtcclxuICAgIH1cclxuICAgICQoYCMke3RoaXMuaWR9YCkub24oJ2NoYW5nZScsIGFzeW5jIChldnQ6IGFueSkgPT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLiN1cGxvYWRGaWxlKGV2dC50YXJnZXQsIHByZXZpZXdGaWxlKTtcclxuICAgICAgJCgnYm9keScpLmNoaWxkcmVuKGAjJHt0aGlzLmlkfWApLnJlbW92ZSgpO1xyXG4gICAgfSk7XHJcbiAgICAkKGAjJHt0aGlzLmlkfWApLnRyaWdnZXIoJ2NsaWNrJyk7XHJcbiAgfVxyXG5cclxuICAjdXBsb2FkRmlsZSA9IGFzeW5jICh0YXJnZXQ6IERhdGFUcmFuc2ZlciwgcHJldmlld0ZpbGU/OiBQcmV2aWV3RmlsZSkgPT4ge1xyXG4gICAgaWYgKCF0YXJnZXQuZmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG9yaWdpbkZpbGVzID0gdGFyZ2V0LmZpbGVzO1xyXG4gICAgY29uc3QgZmlsZXM6IEZpbGVbXSA9IFtdO1xyXG4gICAgaWYgKCFwcmV2aWV3RmlsZSkge1xyXG4gICAgICBpZiAob3JpZ2luRmlsZXMubGVuZ3RoICsgdGhpcy5wcmV2aWV3RmlsZXMubGVuZ3RoID4gdGhpcy5tYXgpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeVNlcnZpY2Uubm90aWZ5Lndhcm5pbmcoYCR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnTWF4IG51bWJlciBvZiBmaWxlcycpfSAke3RoaXMubWF4fWApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yaWdpbkZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGZpbGUgPSBvcmlnaW5GaWxlcy5pdGVtKGkpO1xyXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdpbWFnZScgJiYgdGhpcy5zY2FsZVRvUGl4ZWwgPiAwKSB7XHJcbiAgICAgICAgICBmaWxlID0gYXdhaXQgdGhpcy4jcmVzaXplKGZpbGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgdGhpcy4jdmFsaWRhdGUoZmlsZSk7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAgIHRoaXMubm90aWZ5U2VydmljZS5ub3RpZnkud2FybmluZyhtZXNzYWdlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmlsZXMucHVzaChmaWxlKTtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHsnJ1xyXG4gICAgICAgIGNvbnN0IGxhc3REb3QgPSBmaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKTtcclxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBmaWxlLm5hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKTtcclxuICAgICAgICB0aGlzLnByZXZpZXdGaWxlcy5wdXNoKHtcclxuICAgICAgICAgIGZpbGUsXHJcbiAgICAgICAgICBpc1ByZXZpZXdJbWFnZTogZmFsc2UsXHJcbiAgICAgICAgICBwcmV2aWV3U3JjOiBudWxsLFxyXG4gICAgICAgICAgc3JjOiBudWxsLFxyXG4gICAgICAgICAgZmlsZU5hbWU6IGZpbGUubmFtZSxcclxuICAgICAgICAgIGV4dGVuc2lvblxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBpZHggPSB0aGlzLnByZXZpZXdGaWxlcy5pbmRleE9mKHByZXZpZXdGaWxlKTtcclxuICAgICAgbGV0IGZpbGUgPSBvcmlnaW5GaWxlcy5pdGVtKDApO1xyXG4gICAgICBpZiAodGhpcy50eXBlID09PSAnaW1hZ2UnICYmIHRoaXMuc2NhbGVUb1BpeGVsID4gMCkge1xyXG4gICAgICAgIGZpbGUgPSBhd2FpdCB0aGlzLiNyZXNpemUoZmlsZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbGFzdERvdCA9IGZpbGUubmFtZS5sYXN0SW5kZXhPZignLicpO1xyXG4gICAgICBjb25zdCBleHRlbnNpb24gPSBmaWxlLm5hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKTtcclxuICAgICAgdGhpcy5wcmV2aWV3RmlsZXNbaWR4XSA9IHtcclxuICAgICAgICBmaWxlLFxyXG4gICAgICAgIGlzUHJldmlld0ltYWdlOiBmYWxzZSxcclxuICAgICAgICBwcmV2aWV3U3JjOiBudWxsLFxyXG4gICAgICAgIHNyYzogbnVsbCxcclxuICAgICAgICBmaWxlTmFtZTogZmlsZS5uYW1lLFxyXG4gICAgICAgIGV4dGVuc2lvblxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgdGhpcy4jcHJldmlldygpO1xyXG4gICAgdGhpcy5tb2RlbENoYW5nZS5lbWl0KHRoaXMucHJldmlld0ZpbGVzKTtcclxuICAgIHRoaXMuc2RDaGFuZ2UuZW1pdCh0aGlzLnByZXZpZXdGaWxlcyk7XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBvblJlbW92ZSA9IChwcmV2aWV3RmlsZTogUHJldmlld0ZpbGUpID0+IHtcclxuICAgIHRoaXMubm90aWZ5U2VydmljZS5jb25maXJtRGVsZXRlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMucHJldmlld0ZpbGVzLmluZGV4T2YocHJldmlld0ZpbGUpO1xyXG4gICAgICB0aGlzLnByZXZpZXdGaWxlcy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgdGhpcy5tb2RlbENoYW5nZS5lbWl0KHRoaXMucHJldmlld0ZpbGVzKTtcclxuICAgICAgdGhpcy5zZENoYW5nZS5lbWl0KHRoaXMucHJldmlld0ZpbGVzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25Ecm9wID0gKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pID0+IHtcclxuICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLnByZXZpZXdGaWxlcywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh0aGlzLnByZXZpZXdGaWxlcyk7XHJcbiAgICB0aGlzLnNkQ2hhbmdlLmVtaXQodGhpcy5wcmV2aWV3RmlsZXMpO1xyXG4gIH1cclxuXHJcbiAgI3Jlc2l6ZSA9IGFzeW5jIChmaWxlOiBGaWxlKTogUHJvbWlzZTxGaWxlPiA9PiB7XHJcbiAgICBpZiAoIXRoaXMuc2NhbGVUb1BpeGVsKSB7XHJcbiAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbGFzdERvdCA9IGZpbGUubmFtZS5sYXN0SW5kZXhPZignLicpO1xyXG4gICAgaWYgKGxhc3REb3QgPT09IC0xKSB7XHJcbiAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMO1xyXG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKGltZy53aWR0aCAqIGltZy5oZWlnaHQgPD0gdGhpcy5zY2FsZVRvUGl4ZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZmlsZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBjYW52YXMxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgICAgICBjYW52YXMxLnNldEF0dHJpYnV0ZSgnaWQnLCB0aGlzLiNjYW52YXMxKTtcclxuICAgICAgICAgIGNvbnN0IGN0eDEgPSBjYW52YXMxLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuI3NjYWxlKGltZy53aWR0aCwgaW1nLmhlaWdodCwgdGhpcy5zY2FsZVRvUGl4ZWwpO1xyXG4gICAgICAgICAgY2FudmFzMS53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgY2FudmFzMS5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgICAgY29uc3QgY2FudmFzMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICAgICAgY2FudmFzMi5zZXRBdHRyaWJ1dGUoJ2lkJywgdGhpcy4jY2FudmFzMik7XHJcbiAgICAgICAgICBjb25zdCBjdHgyID0gY2FudmFzMi5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAgICAgY2FudmFzMi53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgY2FudmFzMi5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgICBjdHgyLmRyYXdJbWFnZShpbWcsIDAsIDAsIGNhbnZhczIud2lkdGgsIGNhbnZhczIuaGVpZ2h0KTtcclxuICAgICAgICAgIGN0eDIuZHJhd0ltYWdlKGNhbnZhczIsIDAsIDAsIGNhbnZhczIud2lkdGggKiAwLjUsIGNhbnZhczIuaGVpZ2h0ICogMC41KTtcclxuICAgICAgICAgIGN0eDEuZHJhd0ltYWdlKGNhbnZhczIsIDAsIDAsIGNhbnZhczIud2lkdGggKiAwLjUsIGNhbnZhczIuaGVpZ2h0ICogMC41LCAwLCAwLCBjYW52YXMxLndpZHRoLCBjYW52YXMxLmhlaWdodCk7XHJcbiAgICAgICAgICBjYW52YXMxLnRvQmxvYihibG9iID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLiNibG9iVG9GaWxlKGJsb2IsIGAke2ZpbGUubmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdCl9LnBuZ2ApKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICQoYCMke3RoaXMuI2NhbnZhczF9YCkucmVtb3ZlKCk7XHJcbiAgICAgICAgICAkKGAjJHt0aGlzLiNjYW52YXMyfWApLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgaW1nLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gICNzY2FsZSA9ICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgc2NhbGVUb1BpeGNlbDogbnVtYmVyKSA9PiB7XHJcbiAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQgfHwgIXNjYWxlVG9QaXhjZWwpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB3aWR0aCxcclxuICAgICAgICBoZWlnaHRcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJhdGlvID0gd2lkdGggLyBoZWlnaHQ7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcclxuICAgICAgd2lkdGggLT0gaTtcclxuICAgICAgaGVpZ2h0ID0gTWF0aC50cnVuYyh3aWR0aCAvIHJhdGlvKTtcclxuICAgICAgaWYgKHdpZHRoICogaGVpZ2h0IDw9IHNjYWxlVG9QaXhjZWwpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkdGgsXHJcbiAgICAgIGhlaWdodFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0ID0gKGZpbGU6IFByZXZpZXdGaWxlKSA9PiB7XHJcbiAgICBpZiAoIXRoaXMuI2lzTW9iaWxlT3JUYWJsZXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlICE9PSBmaWxlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gZmlsZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICNibG9iVG9GaWxlID0gKGJsb2I6IEJsb2IsIGZpbGVOYW1lOiBzdHJpbmcpOiBGaWxlID0+IHtcclxuICAgIGNvbnN0IHRlbXA6IGFueSA9IGJsb2I7XHJcbiAgICB0ZW1wLmxhc3RNb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGVtcC5uYW1lID0gZmlsZU5hbWU7XHJcbiAgICByZXR1cm4gYmxvYiBhcyBGaWxlO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQcmV2aWV3RmlsZSB7XHJcbiAgZmlsZTogRmlsZTtcclxuICBzcmM6IHN0cmluZztcclxuICBwcmV2aWV3U3JjOiBzdHJpbmcgfCBBcnJheUJ1ZmZlcjtcclxuICBpc1ByZXZpZXdJbWFnZTogYm9vbGVhbjtcclxuICBmaWxlTmFtZT86IHN0cmluZztcclxuICBleHRlbnNpb24/OiBzdHJpbmc7XHJcbn1cclxuIl19
440
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkM6L1VzZXJzL25naGlhdHQxNV9vbmVtb3VudC9Eb2N1bWVudHMvbGliLWNvcmUtdWkvcHJvamVjdHMvc2QtY29yZS91cGxvYWQtZmlsZS8iLCJzb3VyY2VzIjpbInNyYy9saWIvdXBsb2FkLWZpbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsRUFJakIsWUFBWSxFQUdaLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlELHFGQUFxRjtBQU1yRixNQUFNLE9BQU8sWUFBWTtJQW9FdkIsWUFDRSxhQUFvQyxFQUM1QixHQUFzQixFQUN0QixhQUE4QixFQUM5QixnQkFBb0M7UUFGcEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQWlCO1FBQzlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUF2RTlDLE9BQUUsR0FB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LFlBQVksU0FBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgRWxlbWVudFJlZixcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgVmlld0NoaWxkLFxyXG4gIENvbnRlbnRDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcbmltcG9ydCB7IERldmljZURldGVjdG9yU2VydmljZSB9IGZyb20gJ25neC1kZXZpY2UtZGV0ZWN0b3InO1xyXG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xyXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xyXG5pbXBvcnQgeyBTZE5vdGlmeVNlcnZpY2UgfSBmcm9tICdAc2QtYW5ndWxhci9jb3JlL25vdGlmeSc7XHJcbmltcG9ydCB7IFNkVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BzZC1hbmd1bGFyL2NvcmUvdHJhbnNsYXRlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU2RMYWJlbERlZkRpcmVjdGl2ZSB9IGZyb20gJ0BzZC1hbmd1bGFyL2NvcmUvY29tbW9uJztcclxuXHJcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ0NTkzNzkvcHJldmlldy1hbi1pbWFnZS1iZWZvcmUtaXQtaXMtdXBsb2FkZWRcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzZC11cGxvYWQtZmlsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VwbG9hZC1maWxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi91cGxvYWQtZmlsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZFVwbG9hZEZpbGUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgaWQgPSBgSSR7dXVpZC52NCgpfWA7XHJcbiAgI2lzTW9iaWxlT3JUYWJsZXQgPSBmYWxzZTtcclxuICAjY2FudmFzMSA9IGBDJHt1dWlkLnY0KCl9YDtcclxuICAjY2FudmFzMiA9IGBDJHt1dWlkLnY0KCl9YDtcclxuICBwcmV2aWV3RmlsZXM6IFByZXZpZXdGaWxlW10gPSBbXTtcclxuICBzZWxlY3RlZEZpbGU6IFByZXZpZXdGaWxlO1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdHlwZTogJ2ltYWdlJyB8ICdmaWxlJyA9ICdmaWxlJztcclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGV4dGVuc2lvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgQElucHV0KCkgbWF4ID0gMTtcclxuICBASW5wdXQoKSBtYXhTaXplOiBudW1iZXI7XHJcbiAgQElucHV0KCkgbWF4V2lkdGg6IG51bWJlcjtcclxuICBASW5wdXQoKSBtYXhIZWlnaHQ6IG51bWJlcjtcclxuICBASW5wdXQoKSBzY2FsZVRvUGl4ZWw6IG51bWJlcjtcclxuICAjc3Jjczogc3RyaW5nW107XHJcbiAgQElucHV0KCkgc2V0IHNyY3Moc3Jjczogc3RyaW5nW10pIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHNyY3MpKSB7XHJcbiAgICAgIHRoaXMuI3NyY3MgPSBzcmNzO1xyXG4gICAgICB0aGlzLiNzcmNDaGFuZ2VzLm5leHQodGhpcy4jc3Jjcyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHByZXZpZXdXaWR0aDogc3RyaW5nID0gJzEwMHB4JztcclxuICBASW5wdXQoKSBwcmV2aWV3SGVpZ2h0OiBzdHJpbmcgPSAnMTAwcHgnO1xyXG4gIEBJbnB1dCgpIGFsaWduOiAnbGVmdCcgfCAnY2VudGVyJyA9ICdjZW50ZXInO1xyXG4gIEBJbnB1dCgpIGltYWdlVmFsaWRhdG9yRm46IChpbWFnZTogSFRNTEltYWdlRWxlbWVudCkgPT4gc3RyaW5nO1xyXG4gICNtb2RlbDogUHJldmlld0ZpbGVbXTtcclxuICBASW5wdXQoKSBzZXQgbW9kZWwobW9kZWw6IChzdHJpbmcgfCBQcmV2aWV3RmlsZSlbXSkge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWwpICYmIHRoaXMuI21vZGVsICE9PSBtb2RlbCkge1xyXG4gICAgICBsZXQgZmxhZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLiNtb2RlbCA9IG1vZGVsLm1hcChzcmMgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgKHNyYykgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBsZXQgZXh0ZW5zaW9uID0gbnVsbDtcclxuICAgICAgICAgIGNvbnN0IGJhc2VTcmMgPSBzcmMuc3BsaXQoJz8nKT8uWzBdO1xyXG4gICAgICAgICAgY29uc3QgbGFzdERvdCA9IGJhc2VTcmMubGFzdEluZGV4T2YoJy4nKTtcclxuICAgICAgICAgIGlmIChsYXN0RG90ID4gMCkge1xyXG4gICAgICAgICAgICBleHRlbnNpb24gPSBiYXNlU3JjLnN1YnN0cmluZyhsYXN0RG90ICsgMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmbGFnID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZpbGU6IG51bGwsXHJcbiAgICAgICAgICAgIHByZXZpZXdTcmM6IG51bGwsXHJcbiAgICAgICAgICAgIHNyYyxcclxuICAgICAgICAgICAgaXNQcmV2aWV3SW1hZ2U6IHRoaXMudHlwZSA9PT0gJ2ltYWdlJyxcclxuICAgICAgICAgICAgZXh0ZW5zaW9uXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzcmM7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoZmxhZykge1xyXG4gICAgICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh0aGlzLiNtb2RlbCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy4jbW9kZWxDaGFuZ2VzLm5leHQodGhpcy4jbW9kZWwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy4jbW9kZWwgPSBbXTtcclxuICAgIH1cclxuICB9XHJcbiAgQE91dHB1dCgpIGxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8UHJldmlld0ZpbGVbXT4oKTtcclxuICBAT3V0cHV0KCkgbW9kZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFByZXZpZXdGaWxlW10+KCk7XHJcbiAgQE91dHB1dCgpIHNkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcmV2aWV3RmlsZVtdPigpO1xyXG4gIEBWaWV3Q2hpbGRyZW4oJ2Ryb3BFbGVtZW50JykgZHJvcEVsZW1lbnRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XHJcbiAgQFZpZXdDaGlsZCgnY2FudmFzJykgY2FudmFzOiBFbGVtZW50UmVmO1xyXG4gIEBDb250ZW50Q2hpbGQoU2RMYWJlbERlZkRpcmVjdGl2ZSkgc2RMYWJlbERlZjogU2RMYWJlbERlZkRpcmVjdGl2ZTtcclxuICAjc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gICNjdXJyZW50RHJvcENvbnRhaW5lcjogYW55O1xyXG4gICNzcmNDaGFuZ2VzID0gbmV3IFN1YmplY3QoKTtcclxuICAjbW9kZWxDaGFuZ2VzID0gbmV3IFN1YmplY3QoKTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGRldmljZVNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgbm90aWZ5U2VydmljZTogU2ROb3RpZnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBTZFRyYW5zbGF0ZVNlcnZpY2UpIHtcclxuICAgIHRoaXMuI2lzTW9iaWxlT3JUYWJsZXQgPSAhZGV2aWNlU2VydmljZS5pc0Rlc2t0b3AoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy4jc3JjQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLiNzcmNzKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuI3NyY3MpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHByZXZpZXdGaWxlcyA9IHRoaXMuI3NyY3MubWFwKHNyYyA9PiB7XHJcbiAgICAgICAgbGV0IGV4dGVuc2lvbiA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgYmFzZVNyYyA9IHNyYy5zcGxpdCgnPycpPy5bMF07XHJcbiAgICAgICAgY29uc3QgbGFzdERvdCA9IGJhc2VTcmMubGFzdEluZGV4T2YoJy4nKTtcclxuICAgICAgICBpZiAobGFzdERvdCA+IDApIHtcclxuICAgICAgICAgIGV4dGVuc2lvbiA9IGJhc2VTcmMuc3Vic3RyaW5nKGxhc3REb3QgKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGZpbGU6IG51bGwsXHJcbiAgICAgICAgICBwcmV2aWV3U3JjOiBudWxsLFxyXG4gICAgICAgICAgc3JjLFxyXG4gICAgICAgICAgaXNQcmV2aWV3SW1hZ2U6IHRoaXMudHlwZSA9PT0gJ2ltYWdlJyxcclxuICAgICAgICAgIGV4dGVuc2lvblxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucHJldmlld0ZpbGVzID0gcHJldmlld0ZpbGVzO1xyXG4gICAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQocHJldmlld0ZpbGVzKTtcclxuICAgICAgLy8gdGhpcy5zZENoYW5nZS5lbWl0KHByZXZpZXdGaWxlcyk7XHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24uYWRkKHRoaXMuI21vZGVsQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aChbXSkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuI21vZGVsKSkge1xyXG4gICAgICAgIHRoaXMucHJldmlld0ZpbGVzID0gdGhpcy4jbW9kZWw7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICAgIGlmICghdGhpcy4jaXNNb2JpbGVPclRhYmxldCkge1xyXG4gICAgICBpZiAodGhpcy5kcm9wRWxlbWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IGRyb3BDb250YWluZXIgPSB0aGlzLmRyb3BFbGVtZW50cy5maXJzdC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuI2N1cnJlbnREcm9wQ29udGFpbmVyID0gZHJvcENvbnRhaW5lcjtcclxuICAgICAgICBkcm9wQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgZHJvcENvbnRhaW5lci5zdHlsZS5vcGFjaXR5ID0gMC45O1xyXG4gICAgICAgICAgZHJvcENvbnRhaW5lci5zdHlsZS5ib3JkZXIgPSAnMnB4IHNvbGlkIGdyZXknO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRyb3BDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRyb3BDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAgIGRyb3BDb250YWluZXIuc3R5bGUub3BhY2l0eSA9IDAuNjtcclxuICAgICAgICAgIGRyb3BDb250YWluZXIuc3R5bGUuYm9yZGVyID0gJzJweCBkYXNoZWQgZ3JleSc7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZHJvcENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgYXN5bmMgKGV2dDogRHJhZ0V2ZW50KSA9PiB7XHJcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIGRyb3BDb250YWluZXIuc3R5bGUub3BhY2l0eSA9IDAuNjtcclxuICAgICAgICAgIGRyb3BDb250YWluZXIuc3R5bGUuYm9yZGVyID0gJzJweCBkYXNoZWQgZ3JleSc7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLiN1cGxvYWRGaWxlKGV2dC5kYXRhVHJhbnNmZXIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbi5hZGQodGhpcy5kcm9wRWxlbWVudHMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRyb3BFbGVtZW50cy5sZW5ndGggPiAwICYmIHRoaXMuI2N1cnJlbnREcm9wQ29udGFpbmVyICE9PSB0aGlzLmRyb3BFbGVtZW50cy5maXJzdC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICBjb25zdCBkcm9wQ29udGFpbmVyID0gdGhpcy5kcm9wRWxlbWVudHMuZmlyc3QubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgIHRoaXMuI2N1cnJlbnREcm9wQ29udGFpbmVyID0gZHJvcENvbnRhaW5lcjtcclxuICAgICAgICAgIGRyb3BDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCAoZXZ0OiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZHJvcENvbnRhaW5lci5zdHlsZS5vcGFjaXR5ID0gMC45O1xyXG4gICAgICAgICAgICBkcm9wQ29udGFpbmVyLnN0eWxlLmJvcmRlciA9ICcycHggc29saWQgZ3JleSc7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGRyb3BDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGRyb3BDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZHJvcENvbnRhaW5lci5zdHlsZS5vcGFjaXR5ID0gMC42O1xyXG4gICAgICAgICAgICBkcm9wQ29udGFpbmVyLnN0eWxlLmJvcmRlciA9ICcycHggZGFzaGVkIGdyZXknO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBkcm9wQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBhc3luYyAoZXZ0OiBEcmFnRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGRyb3BDb250YWluZXIuc3R5bGUub3BhY2l0eSA9IDAuNjtcclxuICAgICAgICAgICAgZHJvcENvbnRhaW5lci5zdHlsZS5ib3JkZXIgPSAnMnB4IGRhc2hlZCBncmV5JztcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jdXBsb2FkRmlsZShldnQuZGF0YVRyYW5zZmVyKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLiNzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHJlbG9hZCA9IChwcmV2aWV3RmlsZXM6IFByZXZpZXdGaWxlW10pID0+IHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHByZXZpZXdGaWxlcykpIHtcclxuICAgICAgdGhpcy5wcmV2aWV3RmlsZXMgPSBwcmV2aWV3RmlsZXM7XHJcbiAgICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdChwcmV2aWV3RmlsZXMpO1xyXG4gICAgICAvLyB0aGlzLnNkQ2hhbmdlLmVtaXQocHJldmlld0ZpbGVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICN2YWxpZGF0ZSA9IGFzeW5jIChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcclxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdpbWFnZScpIHtcclxuICAgICAgaWYgKGZpbGUudHlwZS5zcGxpdCgnLycpWzBdICE9PSAnaW1hZ2UnKSB7XHJcbiAgICAgICAgcmV0dXJuIGBbJHtmaWxlLm5hbWV9XSAke3RoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ1VwbG9hZGVkIGZpbGUgaXMgbm90IGFuIGltYWdlJyl9YDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZXh0ZW5zaW9ucz8ubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGxhc3REb3QgPSBmaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKTtcclxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZS5uYW1lLnN1YnN0cmluZyhsYXN0RG90ICsgMSk7XHJcbiAgICAgIGlmICghdGhpcy5leHRlbnNpb25zLnNvbWUoZSA9PiBlLnRvVXBwZXJDYXNlKCkgPT09IGV4dGVuc2lvbi50b1VwcGVyQ2FzZSgpKSkge1xyXG4gICAgICAgIHJldHVybiBgWyR7ZmlsZS5uYW1lfV0gJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdVcGxvYWRlZCBmaWxlIGlzIG5vdCBtYXRjaCBleHRlbnNpb24nKX0gJHt0aGlzLmV4dGVuc2lvbnMuam9pbignLCAnKX1gO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tYXhTaXplKSB7XHJcbiAgICAgIGlmICh0aGlzLm1heFNpemUgKiAxMDI0ICogMTAyNCA8IGZpbGUuc2l6ZSkge1xyXG4gICAgICAgIHJldHVybiBgWyR7ZmlsZS5uYW1lfV0gJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudHJhbnNsYXRlKCdNYXggZmlsZSBzaXplJyl9ICR7dGhpcy5tYXhTaXplfSBNYnNgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50eXBlID09PSAnaW1hZ2UnICYmICh0aGlzLm1heFdpZHRoIHx8IHRoaXMubWF4SGVpZ2h0IHx8IHRoaXMuaW1hZ2VWYWxpZGF0b3JGbikpIHtcclxuICAgICAgY29uc3QgbWVzc2FnZTogc3RyaW5nID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29uc3QgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMO1xyXG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5tYXhXaWR0aCAmJiBpbWcud2lkdGggPiB0aGlzLm1heFdpZHRoKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoYFske2ZpbGUubmFtZX1dICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnTWF4IGltYWdlIHdpZHRoJyl9ICR7dGhpcy5tYXhXaWR0aH1weGApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5tYXhIZWlnaHQgJiYgaW1nLmhlaWdodCA+IHRoaXMubWF4SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoYFske2ZpbGUubmFtZX1dICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnTWF4IGltYWdlIGhlaWdodCcpfSAke3RoaXMubWF4SGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLmltYWdlVmFsaWRhdG9yRm4pIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmltYWdlVmFsaWRhdG9yRm4oaW1nKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGltZy5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAjcHJldmlldyA9ICgpID0+IHtcclxuICAgIGxldCBzdW0gPSAwO1xyXG4gICAgZm9yIChjb25zdCBwcmV2aWV3RmlsZSBvZiB0aGlzLnByZXZpZXdGaWxlcy5maWx0ZXIoZSA9PiBlLmZpbGUpKSB7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXZ0KSA9PiB7XHJcbiAgICAgICAgcHJldmlld0ZpbGUucHJldmlld1NyYyA9IGV2dC50YXJnZXQucmVzdWx0O1xyXG4gICAgICAgIHByZXZpZXdGaWxlLmlzUHJldmlld0ltYWdlID0gcHJldmlld0ZpbGUuZmlsZT8udHlwZS5zcGxpdCgnLycpWzBdID09PSAnaW1hZ2UnO1xyXG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBzdW0rKztcclxuICAgICAgICBpZiAoc3VtID09PSB0aGlzLnByZXZpZXdGaWxlcy5maWx0ZXIoZSA9PiBlLmZpbGUpLmxlbmd0aCkgdGhpcy5sb2FkZWQuZW1pdCh0aGlzLnByZXZpZXdGaWxlcylcclxuICAgICAgfVxyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChwcmV2aWV3RmlsZS5maWxlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uVXBsb2FkID0gKHByZXZpZXdGaWxlPzogUHJldmlld0ZpbGUpID0+IHtcclxuICAgIGlmICgkKGAjJHt0aGlzLmlkfWApLmxlbmd0aCkge1xyXG4gICAgICAkKCdib2R5JykuY2hpbGRyZW4oYCMke3RoaXMuaWR9YCkucmVtb3ZlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAocHJldmlld0ZpbGUgfHwgdGhpcy5tYXggPT09IDEpIHtcclxuICAgICAgJCgnYm9keScpLmFwcGVuZChgPGlucHV0IGlkPVwiJHt0aGlzLmlkfVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiIHR5cGU9XCJmaWxlXCIgLz5gKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICQoJ2JvZHknKS5hcHBlbmQoYDxpbnB1dCBpZD1cIiR7dGhpcy5pZH1cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiB0eXBlPVwiZmlsZVwiIG11bHRpcGxlIC8+YCk7XHJcbiAgICB9XHJcbiAgICAkKGAjJHt0aGlzLmlkfWApLm9uKCdjaGFuZ2UnLCBhc3luYyAoZXZ0OiBhbnkpID0+IHtcclxuICAgICAgYXdhaXQgdGhpcy4jdXBsb2FkRmlsZShldnQudGFyZ2V0LCBwcmV2aWV3RmlsZSk7XHJcbiAgICAgICQoJ2JvZHknKS5jaGlsZHJlbihgIyR7dGhpcy5pZH1gKS5yZW1vdmUoKTtcclxuICAgIH0pO1xyXG4gICAgJChgIyR7dGhpcy5pZH1gKS50cmlnZ2VyKCdjbGljaycpO1xyXG4gIH1cclxuXHJcbiAgI3VwbG9hZEZpbGUgPSBhc3luYyAodGFyZ2V0OiBEYXRhVHJhbnNmZXIsIHByZXZpZXdGaWxlPzogUHJldmlld0ZpbGUpID0+IHtcclxuICAgIGlmICghdGFyZ2V0LmZpbGVzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcmlnaW5GaWxlcyA9IHRhcmdldC5maWxlcztcclxuICAgIGNvbnN0IGZpbGVzOiBGaWxlW10gPSBbXTtcclxuICAgIGlmICghcHJldmlld0ZpbGUpIHtcclxuICAgICAgaWYgKG9yaWdpbkZpbGVzLmxlbmd0aCArIHRoaXMucHJldmlld0ZpbGVzLmxlbmd0aCA+IHRoaXMubWF4KSB7XHJcbiAgICAgICAgdGhpcy5ub3RpZnlTZXJ2aWNlLm5vdGlmeS53YXJuaW5nKGAke3RoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ01heCBudW1iZXIgb2YgZmlsZXMnKX0gJHt0aGlzLm1heH1gKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmlnaW5GaWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBmaWxlID0gb3JpZ2luRmlsZXMuaXRlbShpKTtcclxuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnaW1hZ2UnICYmIHRoaXMuc2NhbGVUb1BpeGVsID4gMCkge1xyXG4gICAgICAgICAgZmlsZSA9IGF3YWl0IHRoaXMuI3Jlc2l6ZShmaWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHRoaXMuI3ZhbGlkYXRlKGZpbGUpO1xyXG4gICAgICAgIGlmIChtZXNzYWdlKSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeVNlcnZpY2Uubm90aWZ5Lndhcm5pbmcobWVzc2FnZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbGVzLnB1c2goZmlsZSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcbiAgICAgICAgY29uc3QgbGFzdERvdCA9IGZpbGUubmFtZS5sYXN0SW5kZXhPZignLicpO1xyXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbGUubmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpO1xyXG4gICAgICAgIHRoaXMucHJldmlld0ZpbGVzLnB1c2goe1xyXG4gICAgICAgICAgZmlsZSxcclxuICAgICAgICAgIGlzUHJldmlld0ltYWdlOiBmYWxzZSxcclxuICAgICAgICAgIHByZXZpZXdTcmM6IG51bGwsXHJcbiAgICAgICAgICBzcmM6IG51bGwsXHJcbiAgICAgICAgICBmaWxlTmFtZTogZmlsZS5uYW1lLFxyXG4gICAgICAgICAgZXh0ZW5zaW9uXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMucHJldmlld0ZpbGVzLmluZGV4T2YocHJldmlld0ZpbGUpO1xyXG4gICAgICBsZXQgZmlsZSA9IG9yaWdpbkZpbGVzLml0ZW0oMCk7XHJcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdpbWFnZScgJiYgdGhpcy5zY2FsZVRvUGl4ZWwgPiAwKSB7XHJcbiAgICAgICAgZmlsZSA9IGF3YWl0IHRoaXMuI3Jlc2l6ZShmaWxlKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBsYXN0RG90ID0gZmlsZS5uYW1lLmxhc3RJbmRleE9mKCcuJyk7XHJcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbGUubmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpO1xyXG4gICAgICB0aGlzLnByZXZpZXdGaWxlc1tpZHhdID0ge1xyXG4gICAgICAgIGZpbGUsXHJcbiAgICAgICAgaXNQcmV2aWV3SW1hZ2U6IGZhbHNlLFxyXG4gICAgICAgIHByZXZpZXdTcmM6IG51bGwsXHJcbiAgICAgICAgc3JjOiBudWxsLFxyXG4gICAgICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXHJcbiAgICAgICAgZXh0ZW5zaW9uXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICB0aGlzLiNwcmV2aWV3KCk7XHJcbiAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQodGhpcy5wcmV2aWV3RmlsZXMpO1xyXG4gICAgdGhpcy5zZENoYW5nZS5lbWl0KHRoaXMucHJldmlld0ZpbGVzKTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG9uUmVtb3ZlID0gKHByZXZpZXdGaWxlOiBQcmV2aWV3RmlsZSkgPT4ge1xyXG4gICAgdGhpcy5ub3RpZnlTZXJ2aWNlLmNvbmZpcm1EZWxldGUoKS50aGVuKCgpID0+IHtcclxuICAgICAgY29uc3QgaWR4ID0gdGhpcy5wcmV2aWV3RmlsZXMuaW5kZXhPZihwcmV2aWV3RmlsZSk7XHJcbiAgICAgIHRoaXMucHJldmlld0ZpbGVzLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQodGhpcy5wcmV2aWV3RmlsZXMpO1xyXG4gICAgICB0aGlzLnNkQ2hhbmdlLmVtaXQodGhpcy5wcmV2aWV3RmlsZXMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkRyb3AgPSAoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPikgPT4ge1xyXG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMucHJldmlld0ZpbGVzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xyXG4gICAgdGhpcy5tb2RlbENoYW5nZS5lbWl0KHRoaXMucHJldmlld0ZpbGVzKTtcclxuICAgIHRoaXMuc2RDaGFuZ2UuZW1pdCh0aGlzLnByZXZpZXdGaWxlcyk7XHJcbiAgfVxyXG5cclxuICAjcmVzaXplID0gYXN5bmMgKGZpbGU6IEZpbGUpOiBQcm9taXNlPEZpbGU+ID0+IHtcclxuICAgIGlmICghdGhpcy5zY2FsZVRvUGl4ZWwpIHtcclxuICAgICAgcmV0dXJuIGZpbGU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsYXN0RG90ID0gZmlsZS5uYW1lLmxhc3RJbmRleE9mKCcuJyk7XHJcbiAgICBpZiAobGFzdERvdCA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIGZpbGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBVUkwgPSB3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkw7XHJcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAoaW1nLndpZHRoICogaW1nLmhlaWdodCA8PSB0aGlzLnNjYWxlVG9QaXhlbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShmaWxlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IGNhbnZhczEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICAgIGNhbnZhczEuc2V0QXR0cmlidXRlKCdpZCcsIHRoaXMuI2NhbnZhczEpO1xyXG4gICAgICAgICAgY29uc3QgY3R4MSA9IGNhbnZhczEuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy4jc2NhbGUoaW1nLndpZHRoLCBpbWcuaGVpZ2h0LCB0aGlzLnNjYWxlVG9QaXhlbCk7XHJcbiAgICAgICAgICBjYW52YXMxLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICBjYW52YXMxLmhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgICBjb25zdCBjYW52YXMyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgICAgICBjYW52YXMyLnNldEF0dHJpYnV0ZSgnaWQnLCB0aGlzLiNjYW52YXMyKTtcclxuICAgICAgICAgIGNvbnN0IGN0eDIgPSBjYW52YXMyLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgICBjYW52YXMyLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICBjYW52YXMyLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICAgIGN0eDIuZHJhd0ltYWdlKGltZywgMCwgMCwgY2FudmFzMi53aWR0aCwgY2FudmFzMi5oZWlnaHQpO1xyXG4gICAgICAgICAgY3R4Mi5kcmF3SW1hZ2UoY2FudmFzMiwgMCwgMCwgY2FudmFzMi53aWR0aCAqIDAuNSwgY2FudmFzMi5oZWlnaHQgKiAwLjUpO1xyXG4gICAgICAgICAgY3R4MS5kcmF3SW1hZ2UoY2FudmFzMiwgMCwgMCwgY2FudmFzMi53aWR0aCAqIDAuNSwgY2FudmFzMi5oZWlnaHQgKiAwLjUsIDAsIDAsIGNhbnZhczEud2lkdGgsIGNhbnZhczEuaGVpZ2h0KTtcclxuICAgICAgICAgIGNhbnZhczEudG9CbG9iKGJsb2IgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMuI2Jsb2JUb0ZpbGUoYmxvYiwgYCR7ZmlsZS5uYW1lLnN1YnN0cmluZygwLCBsYXN0RG90KX0ucG5nYCkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgJChgIyR7dGhpcy4jY2FudmFzMX1gKS5yZW1vdmUoKTtcclxuICAgICAgICAgICQoYCMke3RoaXMuI2NhbnZhczJ9YCkucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBpbWcuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgI3NjYWxlID0gKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBzY2FsZVRvUGl4Y2VsOiBudW1iZXIpID0+IHtcclxuICAgIGlmICghd2lkdGggfHwgIWhlaWdodCB8fCAhc2NhbGVUb1BpeGNlbCkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHdpZHRoLFxyXG4gICAgICAgIGhlaWdodFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmF0aW8gPSB3aWR0aCAvIGhlaWdodDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xyXG4gICAgICB3aWR0aCAtPSBpO1xyXG4gICAgICBoZWlnaHQgPSBNYXRoLnRydW5jKHdpZHRoIC8gcmF0aW8pO1xyXG4gICAgICBpZiAod2lkdGggKiBoZWlnaHQgPD0gc2NhbGVUb1BpeGNlbCkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aCxcclxuICAgICAgaGVpZ2h0XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3QgPSAoZmlsZTogUHJldmlld0ZpbGUpID0+IHtcclxuICAgIGlmICghdGhpcy4jaXNNb2JpbGVPclRhYmxldCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGUgIT09IGZpbGUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBmaWxlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgI2Jsb2JUb0ZpbGUgPSAoYmxvYjogQmxvYiwgZmlsZU5hbWU6IHN0cmluZyk6IEZpbGUgPT4ge1xyXG4gICAgY29uc3QgdGVtcDogYW55ID0gYmxvYjtcclxuICAgIHRlbXAubGFzdE1vZGlmaWVkRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0ZW1wLm5hbWUgPSBmaWxlTmFtZTtcclxuICAgIHJldHVybiBibG9iIGFzIEZpbGU7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFByZXZpZXdGaWxlIHtcclxuICBmaWxlOiBGaWxlO1xyXG4gIHNyYzogc3RyaW5nO1xyXG4gIHByZXZpZXdTcmM6IHN0cmluZyB8IEFycmF5QnVmZmVyO1xyXG4gIGlzUHJldmlld0ltYWdlOiBib29sZWFuO1xyXG4gIGZpbGVOYW1lPzogc3RyaW5nO1xyXG4gIGV4dGVuc2lvbj86IHN0cmluZztcclxufVxyXG4iXX0=
@@ -35,6 +35,7 @@ class SdUploadFile {
35
35
  this.previewHeight = '100px';
36
36
  this.align = 'center';
37
37
  _model.set(this, void 0);
38
+ this.loaded = new EventEmitter();
38
39
  this.modelChange = new EventEmitter();
39
40
  this.sdChange = new EventEmitter();
40
41
  _subscription.set(this, new Subscription());
@@ -67,16 +68,22 @@ class SdUploadFile {
67
68
  return `[${file.name}] ${this.translateService.translate('Max file size')} ${this.maxSize} Mbs`;
68
69
  }
69
70
  }
70
- if (this.type === 'image' && (this.maxWidth || this.maxHeight)) {
71
+ if (this.type === 'image' && (this.maxWidth || this.maxHeight || this.imageValidatorFn)) {
71
72
  const message = yield new Promise(resolve => {
72
73
  const URL = window.URL || window.webkitURL;
73
74
  const img = new Image();
74
75
  img.onload = () => {
75
76
  if (this.maxWidth && img.width > this.maxWidth) {
76
77
  resolve(`[${file.name}] ${this.translateService.translate('Max image width')} ${this.maxWidth}px`);
78
+ return;
77
79
  }
78
80
  if (this.maxHeight && img.height > this.maxHeight) {
79
81
  resolve(`[${file.name}] ${this.translateService.translate('Max image height')} ${this.maxHeight}px`);
82
+ return;
83
+ }
84
+ if (this.imageValidatorFn) {
85
+ resolve(this.imageValidatorFn(img));
86
+ return;
80
87
  }
81
88
  resolve(null);
82
89
  };
@@ -89,6 +96,7 @@ class SdUploadFile {
89
96
  return null;
90
97
  }));
91
98
  _preview.set(this, () => {
99
+ let sum = 0;
92
100
  for (const previewFile of this.previewFiles.filter(e => e.file)) {
93
101
  const reader = new FileReader();
94
102
  reader.onload = (evt) => {
@@ -96,6 +104,9 @@ class SdUploadFile {
96
104
  previewFile.previewSrc = evt.target.result;
97
105
  previewFile.isPreviewImage = ((_a = previewFile.file) === null || _a === void 0 ? void 0 : _a.type.split('/')[0]) === 'image';
98
106
  this.ref.detectChanges();
107
+ sum++;
108
+ if (sum === this.previewFiles.filter(e => e.file).length)
109
+ this.loaded.emit(this.previewFiles);
99
110
  };
100
111
  reader.readAsDataURL(previewFile.file);
101
112
  }
@@ -140,7 +151,6 @@ class SdUploadFile {
140
151
  files.push(file);
141
152
  }
142
153
  for (const file of files) {
143
- '';
144
154
  const lastDot = file.name.lastIndexOf('.');
145
155
  const extension = file.name.substring(lastDot + 1);
146
156
  this.previewFiles.push({
@@ -423,7 +433,9 @@ SdUploadFile.propDecorators = {
423
433
  previewWidth: [{ type: Input }],
424
434
  previewHeight: [{ type: Input }],
425
435
  align: [{ type: Input }],
436
+ imageValidatorFn: [{ type: Input }],
426
437
  model: [{ type: Input }],
438
+ loaded: [{ type: Output }],
427
439
  modelChange: [{ type: Output }],
428
440
  sdChange: [{ type: Output }],
429
441
  dropElements: [{ type: ViewChildren, args: ['dropElement',] }],